我有一个 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 ,它扩展了数据库类
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
答案 0 :(得分:6)
&#34; private&#34; 访问说明符只能在它定义的类中使用,你不能从它定义的类之外调用它,即使是从儿童班。您可以使用&#34; protected&#34; 访问说明符,这些说明符也可用于子类,但不能用于其他类。希望这可以帮助。
答案 1 :(得分:0)
如果方法是私有的,那么有一个原因,为什么该方法是私有的。私有函数只能在类中调用。如果该方法应该在继承的类中可用,则应将该函数标记为protected。 如果该功能应该可以从任何地方访问,那么它必须是公开的。
如果你想改变这个功能的可访问性,你可以用ReflectionMethod::setAccessible
来改变它 - 但这样做通常是设计糟糕的一个很好的指标。
$method = new ReflectionMethod('dbHandeler', 'sql_query');
$method->setAccessible(true);
如果你不想改变辅助功能,你也可以使用反射直接调用方法,这可能是更好的选择。
然而你应该考虑你的设计。如果这是你自己的类,你为什么不把这个函数标记为public或protected?