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

How to acess Private function of another class in PHP

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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){

 }

}

然后我有捐赠.php,它扩展了db类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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类时,出现了以下错误

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

error


"private"访问说明符只在它定义的类中可用,不能从它定义的类外部调用它,甚至不能从子类调用它。您可以使用"受保护的"访问说明符来代替,它也可以用于子类,但不能用于其他类。希望这有帮助。


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

如果要更改函数的可访问性,可以使用ReflectionMethod::setAccessible进行更改,但这样做通常是坏设计的一个好指标。

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

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

不过,你真的应该考虑一下你的设计。如果这是您自己的类,为什么不将该函数标记为public或protected?