Singleton访问/ PHP Magic方法__toString /打印一个静态对象

时间:2013-01-11 12:42:05

标签: php string class object magic-methods

我正在努力实现的目标(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()

3 个答案:

答案 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;