之前写单例模式,要为class定义一个singleton方法,每个用到单例模式的类都要定义,挺麻烦的,就考虑能否继承一个。 尝试了几个方法,能实现继承功能的,则不是严格意义上的单例模式了,后来找到PHP5.3后的get_called_class方法来实现。
/*
* @Copyright (c) 2007,上海友邻信息科技有限公司
* @All rights reserved.
*
* 在 PHP 5.3 中有了get_called_class这个方法。
*
* @filename Singleton.class.php
* @category
* @package
* @author Xinze
* @date 2010-04-04 15:43:21
*/
/**
* Class and Function List:
* Function list:
* - __construct()
* - __clone()
* - getInstance()
* Classes list:
* - Singleton
*/
abstract class Singleton
{
private static $_instance = array();
protected function __construct()
{
}
final private function __clone()
{
}
final public static function getInstance()
{
$called_class_name = get_called_class();
if (!isset($_instance[$called_class_name]))
{
$_instance[$called_class_name] = new $called_class_name();
$_instance[$called_class_name]->init();
}
return $_instance[$called_class_name];
}
public function init()
{
}
}
如果将代码放到PHP5.3之前的环境中运行,这个类则会出问题,如下这个函数可以解决通用问题:
if (!function_exists('get_called_class'))
{
function get_called_class()
{
$bt = debug_backtrace();
$l = 0;
do
{
$l++;
$lines = file($bt[$l]['file']);
$callerLine = $lines[$bt[$l]['line'] - 1];
preg_match('/([a-zA-Z0-9\_]+)::' . $bt[$l]['function'] . '/', $callerLine, $matches);
if ($matches[1] == 'self')
{
$line = $bt[$l]['line'] - 1;
while ($line > 0 && strpos($lines[$line], 'class') === false)
{
$line--;
}
preg_match('/class[\s]+(.+?)[\s]+/si', $lines[$line], $matches);
}
}
while ($matches[1] == 'parent' && $matches[1]);
return $matches[1];
}
}
Related posts:
- PHP 通过共享内存实现消息队列和进程通信的两个类 实现消息队列,可以使用比较专业的工具,例如:Apache ActiveMQ、memcacheq…..,下面是两个基本简单的实现方式: 使用memcache方法来实现 < ?php /* * @Copyright (c) 2007,上海友邻信息科技有限公司...
- 复习PHP5 [size=4]“温故而知新”–一直以来,我记住老祖先的至理名言,只是为了应付考试,从来没有当作一种处理事情的方法或思想!而如今,我越来越觉得老祖先的东西真的很棒,有时间的话,去仔细读读,一定会有很大的收获![/size] 以前读PHP5,只是了解,能看懂PHP5的程序就行了,现在,我再对自己一遍:[color=red]将任何一门语言当作一门新的语言来学习,就算PHP5是PHP4,PHP3升级也不例外![/color] 今天将PHP5中的对象再重新看了一遍,看来我要架设php5服务器了! 新的对象模式PHP5 中的对象已经进行了较系统、较全面的调整,现在的样子可能看起来会有些类似于 Java。本小节着重讲述 PHP5 中新的对象模式,并举了一些较简易的例子来说明。就让本节成为你的 PHP5 之旅的一个新起点吧。:)...
- RSS类RSSFeed – Class [php]m_channel = \”m_XMLversion.\”\\”?>\”; $this->m_channel .= \”\”; } /** * function...
- PHP5 的异常处理机制 [color=darkblue]本文面向的读者[/color] 本文面向希望了解PHP5异常处理机制的程序员。读者需要具有一定面向对象编程和PHP基础。 [color=darkblue]简介[/color]本文集中讨论各种错误处理,在这里你将可以看到PHP4,PHP5中的多种错误处理方式。PHP5引入了“异常机制”――一个在对象体系中进行错误处理的新机制。就像你即将看到的,“异常”提供了不少比传统的错误处理机制先进的特性。 [color=darkblue]PHP5之前的错误处理[/color]在PHP5之前的程序错误处理多使用以下三种办法:1. 使用trigger_error()或die()函数来生成一个脚本层次的警告(warning)或致命错误(fatal error); 2. 在类方法或函数中返回一个错误标记(如false),也可能设置一个之后可以检查的属性或全局变量(如$error),然后在适合的地方检验其值再决定是否继续执行程序(如if($error==1){}); 3. 使用PEAR处理错误;...
- php的小实验-两个结束语 1.下面可以看到,程序结束了,所以不需要标记(;)了,证明标记(;)是一个结束语<?echo __line__?>原来标记(;)也可以做独立单行注解符用啊<?echo \"00000000\";hello1;hello2;hello3;echo \"1111111111\";?> 2.再看看下面的例子<?class hello1{};function __construct(){};?>所以一对括弧也是开始({)结束(})语<?{;;;;;;}?><?{{{{}}}}?> 结论: ;标记本行内容结束,}标记本括弧内程序结束...
1 条评论。