如何在PHP中访问另一个类的私有函数[重复]

Posted

技术标签:

【中文标题】如何在PHP中访问另一个类的私有函数[重复]【英文标题】:How to acess Private function of another class in PHP [duplicate] 【发布时间】:2016-01-25 10:20:37 【问题描述】:

我有一个 dbHandeller.php 文件。如下

class dbHandeler 

    var $conn;

 public function __construct()

        $this->initiatedb();

 

    private function initiatedb()

        //Details of the Databse
            $servername = "localhost";
            $username = "root";
            $password = "";
            $dbname = "xxxxxx";

            // Create connection
            $this->conn = mysqli_connect($servername, $username, $password, $dbname);

            // Check connection
            if (!$this->conn) 
                die("Connection failed: " . mysqli_connect_error());
            else
               return $this->conn;

    

 private function sql_query($query)

 


然后我有 donation.php 并且它扩展了 DB 类

function __autoload($class_name) 
    include $class_name . '.php';


class donation extends dbHandeler


    public function __construct()

        $dbObj = new dbHandeler();
        $dbObj->initiatedb();
    

    public function putDonation()
        var_dump($_POST);

    

    public function getDonation()


    

当我尝试访问 donation 类时,出现以下错误

<br />
<b>Fatal error</b>: Call to private method dbHandeler::initiatedb() from context 'donation' in <b>C:\xampp\htdocs\templeform\api\donation.php</b> on line <b>13</b><br />

error

【问题讨论】:

他们是private 对吧? @RayonDabre 是的,所以如果我要扩展课程,那么我应该能够访问私有课程吧? 使用Reflection 做同样的事情。 把方法改成protected,这样扩展类就可以访问了 你不能访问父类之外的私有函数,你必须了解公共、私有和受保护函数之间的区别。 【参考方案1】:

“private” 访问说明符只能在定义它的类中使用,您不能从定义它的类外部调用它,即使是从子类也是如此。您也许可以改用 "protected" 访问说明符,它也可用于子类,但不能用于其他类。希望这可以帮助。

【讨论】:

最好将此信息添加为评论,它不能被视为答案 @Insomania 他不能发布具有 1 声望的 cmets 感谢@dave 对他讲道理【参考方案2】:

如果方法是私有的,那是有原因的,为什么方法是私有的。私有函数只能在类内部调用。如果该方法应该在继承的类中可用,则应将该函数标记为受保护。 如果函数应该可以从任何地方访问,它必须是公共的。

如果您想更改该功能的可访问性,您可以使用ReflectionMethod::setAccessible 进行更改 - 但这样做通常是一个糟糕设计的良好指标。

$method = new ReflectionMethod('dbHandeler', 'sql_query');
$method->setAccessible(true);

如果你不想改变可访问性,你也可以使用反射直接调用方法,这可能是更好的选择。

尽管如此,您还是应该认真考虑您的设计。如果这是您自己的类,为什么不将函数标记为 public 或 protected?

【讨论】:

以上是关于如何在PHP中访问另一个类的私有函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用另一个类的私有类构造函数访问内部子类

如何访问类的私有构造函数?

C++ - 如何从同一个类的静态函数访问一个类的私有成员?

如何在另一个类的函数中访问一个类的变量?

C ++通过访问器函数返回私有二维数组

如何访问子类中的函数?