当在另一个页面上调用类时,私有函数__construct()不起作用[重复]
Posted
技术标签:
【中文标题】当在另一个页面上调用类时,私有函数__construct()不起作用[重复]【英文标题】:private function __construct() not working when class called on another page [duplicate] 【发布时间】:2013-07-27 01:43:28 【问题描述】:我正在使用以下类型的类...
class datas
protected $req ;
protected $db ;
private function __construct()
$this->db = new Database('localhost', 'user', 'pass', 'db');
$this->db->connect();
public function prnt()
echo "afafa6e5f1ga56d18a1ge";
当我尝试访问类时
$y = new datas();
$y->prnt();
从无效上下文调用受保护数据::__construct()
当我将它公开时,它可以工作。有什么方法可以使构造函数私有并且仍然像我一样拥有调用方法。我在想哪个更安全。
感谢任何见解。
【问题讨论】:
无法实例化具有私有或受保护的类。见***.com/questions/1997721/…。 请注意,类名和类中的可见性以及错误消息(数据与数据、受保护与私有)之间存在差异。在任何情况下,就可以调用它的位置而言,非公共 ctor 遵循与任何其他非公共方法相同的规则。 【参考方案1】:$y = new data();
应该是
$y = new datas();
【讨论】:
是的,好吧……那只是一个错字……谢谢…… 问题可能出在数据库类构造函数中吗?如果我注释掉数据库连接部分(因为我没有该类的代码),您的代码似乎正在工作。 不改了....应该是私有函数__construct() 为什么要私有构造函数? 鉴于 ctor 拥有一个 Database 类,我的假设是这是创建 Singleton 的尝试。【参考方案2】:您的构造函数应该是公开的,因为它是在类上下文之外调用的。
php 可能会使用 new
为您隐藏它,但这仍然是正在发生的事情。
【讨论】:
有没有办法在类上下文中调用它? 你可以在类上创建一个静态公共成员函数,并拥有它return new datas();
。不要使用new
在类外创建一个新实例,而是使用$x = datas::MyStaticFunction();
是的,但为什么呢?我的意思是,如果 OP 可以更改课程,那么他/她也可以将 ctor 更改回 public。
我不是来问为什么的;我只是在回答他们的问题。但这只是工厂模式。这样做可能有很多原因,其中一些实际上是合法的。在现实世界的示例中,可能 datas 是一个抽象基类,datas::MyStaticFunction()
将根据用户为应用程序配置的数据库返回不同的数据子类。以上是关于当在另一个页面上调用类时,私有函数__construct()不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章