如何在PHP中访问另一个类的私有函数
我有一个dbhandler.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"; $
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跟他谈了一些道理