Intereting Posts
DOMCrawler не демпирует данные для разбора Связь в реальном времени между PHP и Flex Показывать статус входа для подключения пользователя с помощью Websocket и Pusher Как удалить переменную $ _POST при нажатии кнопки «Обновить» в браузере с помощью PHP? Порядок по CSS Специфика Когда начать? Создание веб-сайта, использующего базу данных Не удалось запустить тест PHPUnit в PHPStorm Как сохранить дату UTC ISO8601 в базе данных MySQL? кеширование JSON: Apache, PHP, jQuery запрос: минимальная структура для веб-приложений Почему, когда я отправляю XML на PHP, это узлы в нижнем регистре, но когда я разбираю их на PHP, они имеют верхний регистр? Как сделать обратный отсчет с помощью PHP Получение результата из процедуры в laravel – удаление квадратных скобок из ответа Каковы недостатки использования класса базы данных PHP в качестве одноэлементного? Ошибка proc_open при попытке запустить автозагрузку artisan

Могу ли я / Как … вызвать защищенную функцию вне класса в PHP?

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

class cExample{ protected function funExample(){ //functional code goes here return $someVar }//end of function }//end of class function outsideFunction(){ //Calls funExample(); } 

Это точка ООП – инкапсуляция:

Частный

 Only can be used inside the class. Not inherited by child classes. 

защищенный

 Only can be used inside the class and child classes. Inherited by child classes. 

общественного

 Can be used anywhere. Inherited by child classes. 

Если вы все еще хотите вызвать эту функцию снаружи, вы можете объявить открытый метод, который запускает ваш защищенный метод:

 protected function b(){ } public function a(){ $this->b() ; //etc } 

Технически можно использовать частные и защищенные методы с использованием API отражения. Тем не менее, 99% времени – это действительно плохая идея. Если вы можете изменить класс, то правильное решение, вероятно, просто сделает этот метод общедоступным. В конце концов, если вам нужно получить доступ к нему за пределами класса, это приведет к потере точки его защиты.

Вот пример быстрого отражения, если это одна из немногих ситуаций, когда это действительно необходимо:

 <?php class foo { protected function bar($param){ echo $param; } } $r = new ReflectionMethod('foo', 'bar'); $r->setAccessible(true); $r->invoke(new foo(), "Hello World"); 

Вы можете переопределить этот класс другим, где вы делаете это общедоступным.

 class cExample2 extends cExample { public function funExample(){ return parent::funExample() } } 

(обратите внимание, что это не будет работать с частными членами)

Но идея частных и защищенных членов НЕ должна быть вызвана извне.

Если вы хотите использовать код между вашими классами, вы можете использовать черты, но это зависит от того, как вы хотите использовать свою функцию / метод.

Так или иначе

 trait cTrait{ public function myFunction() { $this->funExample(); } } class cExample{ use cTrait; protected function funExample() { //functional code goes here return $someVar }//end of function }//end of class $object = new cExample(); $object->myFunction(); 

Это будет работать, но имейте в виду, что вы не знаете, что делает ваш класс таким образом. Если вы измените черту, все ваши классы, которые ее используют, также будут изменены. Также неплохо написать интерфейс для каждого используемого вами признака.

здесь я могу привести вам один пример, например, ниже

 <?php class dog { public $Name; private function getName() { return $this->Name; } } class poodle extends dog { public function bark() { print "'Woof', says " . $this->getName(); } } $poppy = new poodle; $poppy->Name = "Poppy"; $poppy->bark(); ?> 

или один другой способ использования с последними php

В PHP вы можете сделать это с помощью Reflections. Для вызова защищенных или закрытых методов используйте метод setAccessible () http://php.net/reflectionmethod.setaccessible (просто установите значение TRUE)