我可以/如何...在PHP中调用类外的受保护函数

时间:2013-06-18 16:26:56

标签: php function call protected

我有一个在某个类中定义的受保护函数。我希望能够在另一个函数中将该受保护函数调用到类之外。这是可能的,如果是这样,我怎么能实现它

class cExample{

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

   return $someVar
   }//end of function

}//end of class


function outsideFunction(){

//Calls funExample();

}

7 个答案:

答案 0 :(得分:36)

从技术上讲,可以使用反射API调用private和protected方法。然而,99%的时间这样做是一个非常糟糕的主意。如果你可以修改类,那么正确的解决方案可能只是将方法公之于众。毕竟,如果你需要在课堂外访问它,那就无法标记它受到保护。

这是一个快速反映的例子,如果这是极少数需要它的情况之一:

<?php
class foo { 
    protected function bar($param){
        echo $param;
    }
}

$r = new ReflectionMethod('foo', 'bar');
$r->setAccessible(true);
$r->invoke(new foo(), "Hello World");

答案 1 :(得分:11)

这就是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.

公开

Can be used anywhere. Inherited by child classes.

如果您仍希望在外部触发该功能,可以声明一个触发受保护方法的公共方法:

protected function b(){

}

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

答案 2 :(得分:3)

您可以将此类重写为您公开的其他类。

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

(请注意,这不适用于私人会员)

但私人和受保护成员的想法是不要从外面打电话。

答案 3 :(得分: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();

这样可行,但请记住,您不知道您的课程是以这种方式制作的。如果你改变了特性,那么所有使用它的类也会被改变。为您使用的每个特征编写接口也是一种好习惯。

答案 4 :(得分: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执行此操作。要调用protected或private方法,请使用setAccessible()方法http://php.net/reflectionmethod.setaccessible(只需将其设置为TRUE)

答案 5 :(得分:0)

如果您知道自己在做什么,则可以使用匿名类(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

答案 6 :(得分:0)

另一个选项(PHP 7.4)

<?php
class cExample {
   protected function funExample(){
       return 'it works!';
   }
}

$example = new cExample();

$result = Closure::bind(
    fn ($class) => $class->funExample(), null, get_class($example)
)($example);

echo $result; // it works!