Вопрос по call, php, function, protected – Могу ли я / как… вызвать защищенную функцию вне класса в PHP

9

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

class cExample{

   protected function funExample(){
   //functional code goes here

   return $someVar
   }//end of function

}//end of class


function outsideFunction(){

//Calls funExample();

}
Дубликатstackoverflow.com/q/12255740/2088851 Voitcus
Ты не можешь Это побеждало бы цель иметь защищенную функцию в первую очередь. У вас может быть открытый метод, который вызывает защищенный метод от вашего имени, но зачем тогда начинать с защищенного метода? Marc B

Ваш Ответ

5   ответов
10

Частный

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
}
Вы можете получить доступ к защищенному члену другого экземпляра, если они оба расширяют один и тот же абстрактный класс.Я не верил в это, пока не увидел. DanFromGermany
1

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

<?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)

3

где вы сделаете этот класс открытым.

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

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

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

2

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

Так или иначе

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();

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

34

можно вызывать закрытые и защищенные методы, используя 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");
Это чистое золото (и фактический ответ на вопрос) CptAJ
Это правильный ответ для людей, которые знают, что они делают. Andras Gyomrey
Sidenote: это доступно в PHP 5.4+ (Да!) Lucas Bustamante
Какие-нибудь изменения / новые возможности в 2018 году? b,eppe9000

Похожие вопросы