我正在努力实现的目标(PHP 5.3)是拥有我的表示的访问器,例如,页面的HTML Body。不应直接回应所有内容,而应将其添加到该单例中的条目数组中。示例:myBodyClass::add('<h1>Title</h1>');
add()
被声明为public static function add($strEntry) {}
现在我应该将它们添加到静态数组$条目,例如self::$entries[] = $strEntry;
(类VersionB ),还是应该使用像self::getInstance()->entries[] = $strEntry;
这样的实例? (类VersionA )(其中getInstance()当然会实现'...新自我;'如有必要)
我不太了解差异,我很害怕。
我的问题的第二部分是如何打印对象。关于为什么__toString()不能是静态的PHP手册有点薄 - 但是我再次理解解析器有一个问题将echo myBodyClass
与常量区分开来(原因是什么?)
理想情况下,我想根据需要经常调用add()
来添加正文的所有部分,然后在脚本末尾使用类似echo myHeaderClass, myBodyClass, myFooterClass;
的内容,这应该调用{{1}类中的方法。
感谢您指出我正确的方向。
__toString()
答案 0 :(得分:1)
您可能不应该使用静态添加方法。
单例的想法是创建一个类的单个实例,以便外部对象可以与该实例交互。这意味着你的add方法不应该是静态的。
您可以执行以下操作:
class MyBodyClass
{
protected $entries = array();
protected $instance;
public static function getInstance()
{
if (is_null($this->instance)) {
$this->instance = new self();
}
return $this->instance;
}
private function __construct() {}
public function add($strEntry)
{
$this->entires[] = $strEntry;
}
}
并称之为:
MyBodyClass::getInstance()->add('<h1>blah</h1>');
答案 1 :(得分:1)
(根据OP的要求复制评论......)
你错过了单身人士的观点。单例对象和静态类之间存在差异。如果你想使用作用于对象的方法(比如__toString()),那么你需要它作为一个对象;静态类不够好。如果你想避免一直调用getInstance
,那么根据依赖注入模式,将变量设置为对象,并像处理其他对象一样将其传递到任何地方。无论如何,这可能是最佳实践建议。
具有静态类的东西是它不是真正的OOP;它只是一堆具有共享类名的全局函数。也可以使用带有命名空间声明的普通函数。
但使用正版单例的主要原因是可交换性。假设你遵循我上面的建议并创建对你传递代码的对象的单个引用,交换替代对象变得容易得多,因为你没有在整个地方引用硬编码的类名。这使得为使用该类的代码编写体面的单元测试变得更加容易。
希望有所帮助。
答案 2 :(得分:0)
这样的事情应该有效:
class MySingleton
{
public static function getInstance()
{
static $inst = null;
if ($inst === null) {
$inst = new MySingleton();
}
return $inst;
}
private function __construct() { }
public static function add() {}
public function __toString() {
echo 'Something';
}
}
$body = MySingleton::getInstance();
$body::add('Something');
echo $body;