2013-08-30 5 views
0

следующий пример наверняка вывод об ошибке:Simulate __call() для не объектов

$myVar = "hello"; 
$var->exeptionForSure(); 

==> Fatal error: Call to a member function exeptionForSure() on a non-object in.. 

Есть ли способ, я могу имитировать/реализовать магический метод __call() также работать в такой ситуации?

Я хочу, чтобы у меня была возможность вызвать функцию, если я по какой-то причине пытаюсь получить доступ к методам в не-объектах.

ответ

1

Там нет возможности для этого в PHP, и, вероятно, никогда не будет.

Любой такой метод должен существовать глобально на протяжении всего PHP-скрипта (для него не существует контекста контекста), и его существование, вероятно, усложнит код для такого необычного требования.

Это также подразумевает некоторые слегка странные правила видимости: если предположить, что $non_object->method(42); было переведен как magic_non_object_call($non_object, 'method', array(42)); левого операнда ($non_object) должен быть передан в любом по значению (в этом случае он не может быть записан обратно) или по ссылке (для чего PHP требует отказаться от оптимизаций памяти «копирование на запись» для этой переменной). Обратите внимание, что объекты представлены дополнительным уровнем абстракции, так что $this (и объекты, переданные или скопированные «по значению») фактически содержат дескриптор для «реального» объекта, избегая этой точной проблемы.

По сути, единственная причина, по которой вам нужно это сделать, - обработчик ошибок «последний канал» - если ваш код таков, что вы не можете определить, является ли данная переменная объектом или нет, то есть ошибка. К сожалению, это смертельная ошибка, поэтому я не думаю, что вы можете ее поймать/обработать. (Обратите внимание, что это не Исключение: очень мало встроенных бросков PHP Исключения.)

0

Это должно работать:

method_exists($var, 'exeptionForSure') ? $var->exeptionForSure() : fallback(); 

Вы можете также определить конкретный метод для объекта, который будет делать то же самое, что и выше, так что вы можете сделать следующее:

$obj->call_func('func_name', $params); 
+0

Это потребует от меня изменить весь код, я ищу глобальное решение ... – TCB13

0

только объекты имеют методы, вы можете вызвать. В PHP строки, числа и т. Д. Не являются объектами, поэтому вы не можете определять или вызывать методы на них.

method_exists проверяет, существует ли какой-либо метод для данного объекта. Но вы не должны вызывать эту функцию для не-объектов.

Сначала вы должны проверить, если $ вар это объект или нет:

if (is_object($var) && method_exists($var, 'exeptionForSure')) { 
    $var->exeptionForSure(); 
} else { 
    fallback(); 
}