【问题标题】:How to acess Private function of another class in PHP [duplicate]如何在PHP中访问另一个类的私有函数[重复]
【发布时间】: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,这样扩展类就可以访问了
  • 你不能访问父类之外的私有函数,你必须了解公共、私有和受保护函数之间的区别。

标签: php class oop


【解决方案1】:

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

【讨论】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-01-02
    • 2019-04-18
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 2014-09-05
    • 2017-03-08
    • 1970-01-01
    相关资源
    最近更新 更多