Intereting Posts
Как и где сохранять загруженные файлы с помощью ng-потока? index.php не открывается и не запускается при загрузке файла Предупреждение: file_get_contents не удалось открыть поток: время ожидания подключения включает / simple_html_dom.php в строке 75 Проверьте, является ли один массив подмножеством другого Почему эта форма не работает? Как отключить кнопку заднего браузера после того, как пользователь выйдет из системы и уничтожит сеанс? Twig включает шаблон, расширяющий родительский блок один раз создание простого браузера каталога с помощью php RecursiveDirectoryIterator конвертирование между форматами даты Использование AJAX в плагине WordPress jQuery Mobile: отправка данных с одной страницы на другую Regex соответствует двойным фигурным скобкам РЕШЕНИЕ НАЙДЕНО – одни и те же строки, но var_dump () говорит, что один из них длиннее на 5 символов Простой сценарий выхода Службы приложений и API Google Analytics V3: Аутентификация OAuth2 от сервера к серверу?

PHP-методы, которые работают как в контексте, так и в статическом контексте?

Я пытаюсь настроить некоторые PHP-методы, которые можно вызывать в инстанцированных и статических контекстах. Каковы хорошие способы сделать это? Например, я хочу иметь возможность:

Foo::bar($item); foo($item)->bar(); 

Я мог бы настроить два отдельных класса, и каждая функция изменяет thisArg и делегирует их другому, но похоже, что это лучший способ. Единственный способ, которым я мог бы это сделать, только с одним классом, был бы примерно так:

 function foo($item = null) { return $item instanceof Foo ? $item : new Foo($item); } class Foo { protected $wrapped; public function __construct($item = null) { $this->wrapped = $item; } public function get() { return $this->wrapped; } public function bar($item = null) { isset($this) and $item = &$this->wrapped; // do stuff with $item return isset($this) ? $this : $item; } } 

Если вы посмотрите на код underscore.php, они сделают что-то подобное. Некоторое время назад я прочитал некоторые связанные вопросы, которые указывают, что использование isset($this) для определения контекста может вызвать предупреждение, но, похоже, оно работает нормально … любые обновленные мысли по этому поводу? Другой возможностью может быть создание двух классов: одного со всеми статическими версиями методов, а затем второго класса, который использует __call для делегирования статическому методу, например:

 class _Foo { protected $wrapped; public function __construct($item = null) { $this->wrapped = $item; } public function __call($method_name, $args) { array_unshift($args, $this->wrapped); $this->wrapped = call_user_func_array('Foo::' . $method_name, $args); return $this; } } 

Идеи?

Related of "PHP-методы, которые работают как в контексте, так и в статическом контексте?"