Как PHP естественно предвидит апострофы в переменных? - PullRequest
2 голосов
/ 03 января 2012

Я только что заметил, что могу использовать переменную в качестве аргумента, например: $variable = "This's a string."; function('$variable'), а не так: function('This's a string');. Я понимаю, почему я не могу сделать последнее, но я не понимаю, что происходит за кулисами, что приводит к работе первого примера.

Ответы [ 3 ]

5 голосов
/ 03 января 2012

Вы слышали о формальных языках ?Парсер отслеживает контекст, и поэтому он знает, какие ожидаемые символы, а какие нет.

В тот момент, когда вы закрываете уже открытую строку, вы возвращаетесь в контекст до открытиястрока (то есть в контексте вызова функции в данном случае).

Соответствующие php-внутренние фрагменты кода:

Это соответствующиепатроны C code , которые заставляют его работать.Они являются частью внутренней работы PHP (в частности, Zend Engine).

PHP ничего не предвидит, он действительно читает все символ за символом и выдает ошибку синтаксического анализа, как только находит неожиданный токен.в семантическом контексте, где это не разрешено.

В вашем случае он читает токен 'This', и сканер сопоставляет новую строку.Затем он продолжает читать s и, когда находит пробел, он превращает s в константу .Поскольку константа и ранее найденный токен 'This' вместе не образуют никакого известного сокращения (возможные сокращения описаны в ссылке на парсер, которую я дал вам выше), парсер выдает ошибку вроде

Неожиданный T_STRING

Как вы можете сделать вывод из этого сообщения, оно действительно ссылается на то, что оно нашло (или на что оно надеется, что оно нашло), так что на самом деле нет ожиданий чего-либо.

Ваш вопрос сам по себе неверен в том смысле, что в переменной нет апострофа (в идентификаторе переменной ).Возможно, у вас есть апостроф в значении переменной .Не путайте их.Значение может быть автономным без переменной:

<?php
'That\'s fine';
42;

(это действительный код PHP, который просто загружает эти значения в память)

1 голос
/ 03 января 2012

функция ('$ variable') не должна работать правильно

Символы в " " экранирующих одинарных кавычках

Символы в '' не экранируют одинарные кавычки (они не могутизбегайте самих себя!).

Использование "" также позволяет использовать переменные как часть строки, поэтому:

$pet = 'cat'
$myStory = "the $pet walked down the street"

function($pet) - это способ передачи функциистрока

0 голосов
/ 03 января 2012

используйте это так

function('This\'s a string');

...