Но утверждение "массив ($ this, 'sql_escape_string')" меня выбрасывает, поскольку я ожидал бы просто '$ this-> sql_escape_string' или это неверный синтаксис?
Это действительно, но не относится к тому, что вы думаете, это относится. Рассмотрим свободные функции, константы, имена классов и переменные: каждая существует в разных средах (или «пространствах имен», если вы предпочитаете, но это легко спутать с пространствами имен PHP ). Различная среда для переменных становится явной с помощью использования "$" в качестве сигил : переменная $foo
против функции foo()
, константа foo
и класс Foo
. Именно поэтому константы и переменные чувствительны к регистру, а имена функций и классов - нет: разные среды допускают разные правила разрешения имен.
Аналогично, методы и свойства объекта существуют в разных средах. Как следствие, $this->sql_escape_string
относится к свойству, а не к методу. Чтобы запутать вещи, это свойство может содержать вызываемый объект, хотя такой вызываемый объект не может быть вызван напрямую :
class Foo {
function frob() {return 23.0 / 42;}
}
$foo = new Foo;
$foo->frob = function () {return 0 / 0;};
$foo->frob(); # calls method, not closure function
$frob = $foo->frob;
$frob(); # oops: division by zero
Как и в случае констант и функций, свойства и методы отличаются отсутствием или наличием списка аргументов.
Если это так, как перенос $ this и 'sql_escape_string' в массив создает действительную функцию обратного вызова для использования array_map ()?
Синтаксис PHP для вызываемых ссылок выходит за рамки строк.
Свободные функции (функции, не связанные с классом или объектом; в отличие от «связанных функций») могут однозначно именоваться их именами. Статические методы связаны с классом, но на них можно ссылаться строкой, если она включает имя класса (синтаксис «Class :: method»). Однако строка не может содержать достаточно информации для метода объекта, поскольку метод должен быть привязан к определенному объекту, а PHP не имеет возможности ссылаться на объект с помощью строки. Решением, на котором остановились разработчики PHP, было использование синтаксиса массива (как показано в примере кода вопроса). Они также включили поддержку синтаксиса массива для статических методов (array('Class', 'method')
).
Помимо вызываемых ссылок, вызываемые могут быть замыканиями. Они предлагают альтернативный способ передачи объектных методов, но являются более подробными и сложными.
$self = $this; # workaround: $this not accessible in closures before 5.4
$args = array_map(
function ($value) use($self) {
return $self->sql_escape_string($value);
}, $args);
Замыкания не так полезны, когда подойдет вызываемая ссылка, но в целом более эффективны.