можете показать этот код? я понимаю, что переменную можно создать в классе, которая там не определена, но вот метод, по-моему, нельзя. Но вдруг можно. Код (Text): <?php class A {} $a = new A(); $a->b = 1; echo $a->b; // видим 1 $a->c = function() {echo 2;}; call_user_func_array(array($a, 'c'), array()); // call_user_func_array() expects parameter 1 to be a valid callback, class 'A' does not have a method 'c' in ... on line ... $a->c(); // Call to undefined method A::c() in ... on line ... exit();
как описали изначально задачу, так мы её и поняли. а вот это поподробнее. как именно вы это сейчас делаете? опишите подробнее или код покажите.
полный гугл примеров, вот один из них: Код (Text): class blank { private $functions = array(); private $vars = array(); function __set($name, $data) { if(is_callable($data)) $this->functions[$name] = $data; else $this->vars[$name] = $data; } function __get($name) { if(isset($this->vars[$name])) { return $this->vars[$name]; } } function __call($method,$args) { if(isset($this->functions[$method])) { return call_user_func_array($this->functions[$method], $args); } } } Код (Text): $obj = new blank; $obj->param = 'Новый параметр'; $obj->method = function() { return 'Новый метод'; }; echo $obj->param; echo $obj->method(); Добавлено спустя 1 минуту 16 секунд: и это не единственный вариант, можно через Reflection но я не пробовал Добавлено спустя 4 минуты 26 секунд: я про пример спросил, там вроде все понятно
гм. мягко скажем - это извращение. и лучше от этого сразу отказаться. но решение задачи в таком коде очевидно: если имя метода есть в массиве $functions, то это магический метод.
странно, но это обычная реализация фабрики на пхп Добавлено спустя 11 минут 9 секунд: вообще не о том, причем здесь что я делаю??? вам всем хочется проверить мой уровень? или по тролить или что? я просто не могу понять какое отношение имеет задача которую я пытаюсь реализовать к моему вопросу? еще раз: в приложении необходимо проверить, описан ли вызываемый метод/свойство с помощью магии (__call() или __callStatic() или __set()), или он обычный пример: Код (Text): class myClass { public function __call($method, $arguments) { return 'is magic'; } public function notMagic() { return 'not a magic'; } } $reflection = new ReflectionMethod('myClass', 'magic'); if ($reflection->isMagic()) { /* do some shit if is magic */ } в классе 2 метода Код (Text): $reflection->anyShit() и Код (Text): $reflection->notMagic() как из вне узнать какой из них как описан? если вам не интересно или не понятно, или вы считаете мой вопрос или меня глупым, или по любой другой причине, просто оставьте без внимания
я ж написал - добавьте в ваш класс метод isMagic(), где проверяете массив $functions. Использование Reflection - ещё большее извращение, чем магические методы))) Если вдруг вам интересно, то пара доводов - отладка и использование IDE. Могу завтра ещё добавить. и кстати, я думал, что фабрика - это что-то типа такого Код (Text): <?php class FormElementFactory { public static function getFormElement($name, $args) { $class = 'FormElement' . $name; return new $class($args); } } $element = FormElementFactory::getFormElement('submit', array()); ваш код, снова по-моему, это не фабрика, но на что похоже тоже поищу завтра. пс. извините, если обидел, просто хотел помочь.
думаю что никак. обычные методы можно проверить через method_exist или рефлекшн. а то что описано внутри __call например, никак не узнать. если только не перечислить списк магических методов внутри отдельной переменной-списка. заводите новый метод, добавляйте в список. да вам об этом уже писали выше.
да я сам не особо понимаю Добавлено спустя 3 минуты 7 секунд: мне нужно до того как положить его в этот массив проверить существует ли он в родителе (AR) а фабрика это когда толпой создаешь объкты, которыми также толпой и управляешь
Если хочется через рефлекшн, то есть ReflectionProperty, у ReflectionProperty есть getValue(). Можно получить значение твоего массива (хоть они и приватный) и уже работать с ним. Тут кстати ещё такая проблема. Всё-таки ты не методы класса создаёшь. Ты также добавляешь некую переменную, в которую кладёшь название функции. А вот у этой функции контекста объекта-то нет. Его туда явно надо передавать, что-то типа $obj->method = function($obj) {} и потом $obj->method($obj). В самой функции будет получение свойств как $obj->prop, а не $this->prop. Как-то так. Собственно поэтому не получается использовать обычный method_exist(), метод-то не добавляется, как бы ты не уговаривал
Описанный метод является не магическим, а недоступным. ман: Следовательно, получить о нем какую-либо информацию, невозможно. Бектрейс проливает свет на кухню магии: Код (PHP): <?php class a { public function __call($method, $arguments) { if ($method == 'magic') { var_dump(debug_backtrace()); echo __METHOD__ . "\r\n"; echo 'Is callable?'; var_dump(is_callable('a::magic')); return 'is magic'; } } } $a = new a; $a->magic(); echo 'Is callable?'; var_dump(is_callable('a::magic')); итак, мы видим, что обращение к неопределенному методу magic ведет на __call, которому передается два аргумента: имя метода magic и ссылка на массив с аргументами magic. Константа __METHOD__ показывает, что в действительности выполняется метод __call. Но магия все же есть: метод magic действительно появляется во время выполнения __call, и исчезает сразу после выполнения. Очевидно, это способ избежать Fatal error. Магия или нет - наверняка можно определить из самого метода, а снаружи только косвенно, по is_callable = false.