Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中访问另一个类的私有函数_Php_Class_Oop - Fatal编程技术网

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

如何在PHP中访问另一个类的私有函数,php,class,oop,Php,Class,Oop,我有一个dbhandler.php文件。如下 class dbHandeler { var $conn; public function __construct(){ $this->initiatedb(); } private function initiatedb(){ //Details of the Databse $servername = "localhost"; $

我有一个dbhandler.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){

 }

}
然后我有了generation.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(){


    }
}
当我试图访问
捐赠
类时,我遇到以下错误

<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

致命错误:从第13行C:\xampp\htdocs\templeform\api\generation.php中的上下文“generation”调用私有方法DbHandler::initiatedb() 错误
访问说明符“private”仅在定义它的类中可用,不能从定义它的类之外调用它,甚至不能从子类调用它。您可以使用“protected”访问说明符,该说明符也适用于子类,但不适用于其他类。希望这有帮助

访问说明符“private”仅在定义它的类中可用,不能从定义它的类之外调用它,甚至不能从子类调用它。您可以使用“protected”访问说明符,该说明符也适用于子类,但不适用于其他类。希望这有帮助

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

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

$method = new ReflectionMethod('dbHandeler', 'sql_query');
$method->setAccessible(true);
如果不想更改可访问性,还可以使用反射直接调用该方法,这可能是更好的选择


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

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

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

$method = new ReflectionMethod('dbHandeler', 'sql_query');
$method->setAccessible(true);
如果不想更改可访问性,还可以使用反射直接调用该方法,这可能是更好的选择


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

它们是
private
对吗?@RayonDabre是的,因此如果我扩展类,那么我应该能够访问private类对吗?使用
Reflection
也可以这样做。将方法更改为
protected
,因此,扩展类将能够访问它。如果不能访问父类之外的私有函数,则必须了解公共函数、私有函数和受保护函数之间的区别。它们是
private
对吗?@RayonDabre yes,因此,如果我扩展类,那么我应该能够访问私有类,对吗?使用
反射
也可以这样做。将方法更改为
受保护
,这样扩展类就能够访问它。如果不能访问父类之外的私有函数,则必须了解公共函数和,私有和受保护的函数。如果将此信息添加为注释,则不能将其视为Answer@Insomania他不能发表有1个声誉的评论谢谢你在@davebetter与他交谈,如果你将此信息添加为评论,它不能被视为一种威胁Answer@Insomania他不能发表有1个声誉的评论谢谢你在dave跟他谈了一些道理