php5 私有方法调用,关于php:在PHP5类中,何时调用私有构造函数?

假设我正在编写一个php(>=5.0)类,该类应该是单例的。我读过的所有文档都说要将类构造函数设为私有的,这样类就不能直接实例化。

所以如果我有这样的东西:

class SillyDB

{

private function __construct()

{

}

public static function getConnection()

{

}

}

是否有任何情况下调用了u construct(),除了如果我正在执行

new SillyDB()

在类内部调用?

为什么我可以从内部实例化sillydb?

只有从包含私有构造函数的类的方法中调用__construct()。所以对于您的单例,您可能有这样的方法:

class DBConnection

{

private static $Connection = null;

public static function getConnection()

{

if(!isset(self::$Connection))

{

self::$Connection = new DBConnection();

}

return self::$Connection;

}

private function __construct()

{

}

}

$dbConnection = DBConnection::getConnection();

之所以能够/希望从内部实例化类,是因为可以检查以确保在任何给定时间只存在一个实例。毕竟,这是单身汉的全部观点。使用singleton进行数据库连接可确保应用程序一次不进行大量的DB连接。

编辑:按照@emanuele del grande的建议添加了美元

当您在self::Connection中没有$符号的情况下引用静态属性Connection时,有一点错误。通过这种方式,PHP解释器将其解析为一个常量,如果不定义该常量,则会引发错误。

下面是一个非常简单的单例,它只生成日期/时间字符串:

class TheDate

{

private static $DateInstance = null;

private $dateVal;

public static function getDateInstance()

{

if(!isset(self::$DateInstance))

{

self::$DateInstance = new TheDate();

}

return self::$DateInstance;

}

public static function getDateVal()

{

return self::$DateInstance->dateVal;

}

private function __construct()

{

$this->dateVal = strftime("%Y-%m-%d %H:%M:%S");

}

}

做这样的事情显然会让我一次又一次的约会:

$date1 = TheDate::getDateInstance();

echo $date1->getDateVal() ."
";

$date2 = TheDate::getDateInstance();

echo $date2->getDateVal() ."
";

这样做不会产生任何错误:

class NewDate extends TheDate

{

public function __construct()

{

}

}

好吧,我自己做了一些测试。

如果不在子类中声明自己的构造函数,尝试实例化它将引发致命错误,因为它试图调用超类构造函数。

在数据库连接的情况下,当您可能返回mysqli实例或mysql_connect()函数返回的资源(或其他链接到其他RDBMS)时,只要您将实例标记为私有,就不会有人对其进行子类化和篡改链接的威胁。

正如我之前提到的,如果有人真的想要覆盖你的行为并建立多个连接,他们也可以通过编写一个新的类来完成。

测试代码,马克,让我知道你发现了什么。

编辑:另外,在这种特定的情况下,我不知道为什么您需要考虑阻止一个人进行子类化。如果有人可以访问您的PHP代码来对其进行子类化,那么他们也可以访问您的代码来复制它,并将访问修饰符更改为他们(出于任何原因)认为合适的内容。

在这种情况下,singleton的实际用途是,通过使用它,可以确保对给定的HTTP请求始终使用相同的数据库连接。它实现了这一点。从理论的角度来看,其他的东西(使用final和私有构造函数)是有用的,更有用的是知道是否要将API质量代码分发给其他程序员,但是在这个特定的例子中,所有的关键字都在为类文件的大小添加字节。

有点吹毛求疵:为了完整性,您可能也会声明该类是最终的,因为您不希望有人子类化该类并实现它自己的公共构造函数。

(如果编译器捕获了私有构造函数的重写,请原谅我,但我认为它没有捕获到。)

这是一个评论,不是回答,但很有意义

secure.php.net/manual/en/language.oop5.final.php(安全.php.net/manual/en/language.oop5.final.php)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值