我有一个在某个类中定义的受保护函数。我希望能够在另一个函数中将该受保护函数调用到类之外。这是可能的,如果是这样,我怎么能实现它
class cExample{
protected function funExample(){
//functional code goes here
return $someVar
}//end of function
}//end of class
function outsideFunction(){
//Calls funExample();
}
答案 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!"
答案 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!