PHP:在类中处理私有函数和公共函数

PHP:在类中处理私有函数和公共函数,php,Php,我有一个php文件,其中包含一个类和一个私有函数 oldfile.php 我需要这个函数作为另一个类中的公共函数 我能否以某种方式将文件加载到我的新类中,例如使用include,并在我的新类中将另一个类的私有函数视为公共函数 newfile.php 这是不可能的,类的私有方法只能在该类中使用 这里有更多的例子 您可以使用反射来更改其可见性,例如: <?php class oldClass { private function functionTest($foo) {

我有一个php文件,其中包含一个类和一个私有函数

oldfile.php

我需要这个函数作为另一个类中的公共函数

我能否以某种方式将文件加载到我的新类中,例如使用include,并在我的新类中将另一个类的私有函数视为公共函数

newfile.php


这是不可能的,类的私有方法只能在该类中使用

这里有更多的例子

您可以使用反射来更改其可见性,例如:

<?php

class oldClass
{
    private function functionTest($foo)
    {
        echo 'Private functionTest() called with argument ', $foo, PHP_EOL;
    }
}

class newClass
{
    public function functionTest($foo)
    {
        $method = new ReflectionMethod(oldClass::class, 'functionTest');
        $method->setAccessible(true);
        return $method->invoke(new oldClass(), $foo);
    }
}

$foo = new newClass();
$foo->functionTest('Blah');
您可以缓存类属性中的内容,这样就不必每次都创建一个新的ReflectionMethod实例,但我希望您已经了解了这一点


不用说,这不是在面向对象编程的正常过程中所做的事情。处理无法重新设计的第三方代码是一种黑客行为。

与其尝试巧妙的伎俩,不如将函数公开,为什么不将其公开?我已经看到很多未记录的东西……私有意味着私有。您不能访问其类之外的私有函数。要么将其公开,要么使另一个公共函数可以访问并返回您需要的任何私有内容。@MaxMuster:您可以使用。如果您无法访问旧类,请为其编写包装,并将其视为API。不要影响能见度。如果两个类共享相同的逻辑,那么该逻辑必须在其自己的测试范围内!!我很好奇你是如何检测由这样的东西引起的bug的。。。我强烈建议您不要使用reflection+来破坏可见性invocation@pmk我完全同意,像这样的东西应该永远是最后的选择。@pmk想象一下你正在使用一个软件,比如CMS或类似的,你想添加一些功能。您无法重新设计代码,因为在下一次更新时,它将再次更改。因此,您不能一直修补代码。所以,您希望添加可与外部代码一起使用且不修改它的代码。谢谢@alvarogonzález
class newClass {
    
    /* 
      import functionTest() from oldClass as public function in newClass ??? 
      
    */
    
    from oldfile.php import oldClass public functionTest  // ???
    // or
    from oldClass import functionTest as public           // ???
    
}
<?php

class oldClass
{
    private function functionTest($foo)
    {
        echo 'Private functionTest() called with argument ', $foo, PHP_EOL;
    }
}

class newClass
{
    public function functionTest($foo)
    {
        $method = new ReflectionMethod(oldClass::class, 'functionTest');
        $method->setAccessible(true);
        return $method->invoke(new oldClass(), $foo);
    }
}

$foo = new newClass();
$foo->functionTest('Blah');