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

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

class cExample{

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

   return $someVar
   }//end of function

}//end of class


function outsideFunction(){

//Calls funExample();

}

Ответ 1

То, что точка OOP - инкапсуляция:

Частный

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.

Public

Can be used anywhere. Inherited by child classes.

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

protected function b(){

}

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

Ответ 2

Технически, можно использовать частные и защищенные методы с использованием 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");

Ответ 3

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

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

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

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

Ответ 4

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

В любом случае

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

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

Ответ 5

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

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

Ответ 6

Если вы знаете, что делаете, вы можете использовать анонимный класс (PHP 7+)

class Bar {
    protected baz() {
        return 'Baz!';
    }
}

$foo = new class extends Bar {
    public baz() {
        parent::baz();
    }
}

$foo->baz(); // "Baz!"

https://www.php.net/manual/en/language.oop5.anonymous.php