PHP构造函数在可以提供嵌套变量的参数之前执行

teh*_*oob -1 php oop constructor class

首先,这里有一个小代码片段来帮助解释我的问题:

<?php
class foo {

    public $title;

    __construct{

        echo "<html>\n";
        echo "<head>\n";
        echo "<title>".$this->title."</title>\n";
        echo "</head>\n";
        echo "<body>\n";

    }

    /**
    *
    * I get $title from index.php
    *
    */
    public function setTitle( $title )
    {

        $this->title = $title;

    }


    __destruct{

        echo "</body>\n";
        echo "</html>\n";

    }

}
?>
Run Code Online (Sandbox Code Playgroud)

你可能已经注意到这段代码会产生一个好的标题.是的,那里有一个空的空间.: - )

对我来说,这实际上是完全合理的(即使我没想到它),因为类构造函数正在创建foo对象时执行,这意味着它不会等待index.php来提供其中的参数setTitle(). turn返回填充的字符串$this->title.

因此,如果我真的了解这里发生了什么,我该怎么做才能解决这个问题?我应该使用内置缓冲区函数缓冲输出,然后使用提供的标题字符串修改存储的输出?有任何想法吗?

我真的,真的,真的,喜欢保持这个结构,其中构造函数和析构函数包含这个重复的代码.很高兴这些功能不必在任何地方调用.我知道有些开发人员可能会考虑这种不好的做法,但无论如何我会这样做,因为我想,因为我觉得它很酷.所以我并不是真的在这方面寻求建议,除非你非常有动力告诉我我的愚蠢.

所以,如果你有任何建议/想法/知识与我分享这将是伟大的.

谢谢,并随时抽出你的时间,因为我想我将被迫留在里面躲避来到我的城市的邪恶猪流感,所以不要急!

Pet*_*ley 8

teh_noob.听我说.我正在这里打字的这些话.假装我在说他们,并听到从我嘴里说出来的话.编号NO NO NO NO NO! 不,我不会给老鼠的屁股,你认为它是多么"酷".

这是一个令人遗憾的场景,其中列出关于这种方法的"正确"事物是"错误"的事情会更短.也就是说,你的问题很多. 话虽这么说,我将只讨论一些对这个想法不好的事情.

首先,我们来讨论一般的OOP.你在这里做的是我最不喜欢的东西:我称之为"用课程编程".也就是说,结构化编程以OOP为幌子,因为使用了类关键字.如果你要这样做,不要打扰.只需使用功能.这类滥用简单明了.

类是对象蓝图.对象适合封装和实例化.除非你真的是Singleton模式的粉丝,为什么要创建一个明确设计为仅实例化一次的类?在你说"但彼得,单身人士模式帮助我们!!! 1"之前,试着明白它实际上并不是那么好.此外,你在这里做的事情甚至不是人们首先转向Singleton模式的原因.

其次是子类的主题.也许在将来的某个时候你会想要一些适合你网站的弹出页面.或者你会想要不仅仅是CSS驱动的仅打印版本.也许你甚至想要一些非HTML的东西就像一个RSS提要.现在怎么办?在这个构造函数中进行了多少其他工作,您是否必须复制这些新的页面类型才能工作?但是,如果您已经开始依赖子类来创建单独的页面呢?现在你性交.当然,您可以返回并连接装饰器模式,但是为什么要通过非愚蠢的类设计首先避免这个问题来完成所有工作?

第三,首先是回声HTML的想法.我对这里的一两个字回声很好,那里有一个或三个标签.但对于大型HTML块,它只是白痴.有礼仪逃脱到输出模式并使用未锁定在字符串中的HTML.它不仅更容易编辑和阅读,如果您愿意,您可以在WYSIWYG中实际使用它.

第四,这严重,严重打破了SRP.

第五 - 这种荒谬的设计导致了你在这里试图解决的那类问题.只有您不想知道解决方案是从构造函数中删除echo语句.有办法解决吗?当然.事实上,甚至不止一个.我推荐他们中的任何一个吗?不,不是真的.

最后,让我们讨论标题.也许你还没有了解它们.也许你有并且不在乎.但是,从现在起6个月后,你正在解决一个问题并且你正在使用一个方法,在堆栈深处进行10次调用,并且你意识到一个简单的header()函数将解决你的问题.也许您需要调整缓存控制,或者您需要手动设置响应代码 - 无论如何.但你猜怎么着,你做不到.为什么?因为你愚蠢的构造函数输出到它创建的毫秒.

所以,回顾一下:不! 除非你的实际,最终目标是在The Daily WTF上看到你的一些手工作品.

除了警告,我还能提供什么?也许是新方向的一部分?好吧,在精心构建的系统中,调试输出很难,所以不要开始用自己的脚来自己拍摄它.系统的所有输出都应该是明确的.如果你想制作一个"页面"类的类,那很好.就是不要那样做.

class foo
{
    protected $title;
    protected $headers;

    public function setTitle( $title )
    {
        $this->title = $title;
    }

    public function addHeader( $header )
    {
        $this->headers[] = $header;
    }

    public function sendHeaders()
    {
        foreach ( $this->headers as $header )
        {
            header( $header );
        }
    }

    public function printPageHeader()
    {
        $this->sendHeaders();
        ?>
            <html>
                <head>
                    <title><?php echo $this->title; ?></title>
                </head>
                <body>
        <?php
    }

    public function printPageFooter()
    {
        ?>
                </body>
            </html>
        <?php
    }

    public function printPage()
    {
        $this->printPageHeader();
        $this->printPageFooter();
    }
}

$p = new foo;
$p->setTitle( 'Just Testing' );
$p->addHeader( 'Cache-control: no-cache' );
$p->printPage();
Run Code Online (Sandbox Code Playgroud)