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

<?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";

    }

}
?>

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

对我来说,这实际上非常有意义(即使我没想到它),因为类构造函数正在创建foo对象时执行,这意味着它不会等待index.php来提供参数对于 setTitle(),它反过来返回填充 $ this-&gt; title 的字符串。

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

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

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

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

有帮助吗?

解决方案

teh_noob。听我说。我正在这里打字的这些话。假装我在说他们,并听到从我嘴里说出来的话。没有。 NO NO NO NO NO 不,我不会给老鼠屁股如何“冷静”你认为是。

这是一个不幸的情况,其中列出“正确”的情况会更短。关于这种方法的事情是“错误的”的东西。也就是说,你的问题很多。话虽这么说,我将只讨论只有一些关于这个想法不好的事情。

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

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

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

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

第四,严重的是,严重打破了 SRP

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

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

所以,回顾一下: NO! 除非你的动作

其他提示

您可以在析构函数中执行所有打印。所有变量都是已知的。然而(就像你自己说的那样)我认为这真的是非常糟糕的做法。我建议使用一种视图/模板文件(你还有足够的时间:))。

您可以在构造函数中将标题作为参数传递吗?

  

schnalle:这是不好的做法。这很疯狂。
   the_noob:疯狂......?
   the_noob: (shouts)这......是...... LITTLEFRAMEWORKIMBUILDING!
   the_noob: (将代码和演示文稿分离开来)

我真的不知道你想做什么,只是将标题作为参数传递给构造函数......

<?php

class Title {
    public function __construct($title) {

        echo '<html><head><title>' . htmlspecialchars($title) . '</title></head><body>';
    }

    public function __destruct() {
        echo '</body></html>';
    }
}

?>

如果你真的想让你的对象打印一些东西,我会建议使用神奇的__tostring()方法,这样你就可以简单地 echo 你的对象了。但是对于html标签......仍然无用。

我祝你的框架运气好,但你要么是天才(不太可能),要么是每个初学者都犯同样的错误(差不多)(在MVC到来之前)。

  

编辑:我帮不了你。您希望在创建对象时直接输出,但需要在创建对象之前将数据导入到对象中。所以你试着解决丑陋的事情,使其变得更加丑陋。它只是不起作用!
  你试图通过将轮子安装到活驴身上来制造一种新的,更好的汽车,然后抱怨,因为它不知道如何没有按照你的预期(驴子在轮子上!哇!),现在你问社区如何以一种使驴/车更快的方式安装尾灯。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top