当在另一个页面上调用类时,私有函数__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()不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

1php----自动加载类 __autoload()函数

类中的@staticmethod

面向对象进阶

私有属性私有方法

__autoload() 类文件自动加载函数

当在 UITableView(在另一个笔尖/视图上)上按下单元格时,如何导航到笔尖(视图)?