【问题标题】:Page generation from PHP class从 PHP 类生成页面
【发布时间】:2010-11-08 02:46:28
【问题描述】:

我实际上是为了好玩而创建网站,我的一些朋友告诉我,如果我可以使用代表整个页面的 php 类创建页面的输出,我会更有效率。

我想知道你们是怎么做到的。

谢谢

【问题讨论】:

  • 大约有 1001 种方法可以实现这一点。也许您想详细说明您想做什么?
  • 他听起来对 PHP 中的 OOP 不是很有经验,所以也许我们不让他解释他不熟悉的东西,而是提供一些解决方案/答案?

标签: php class code-generation


【解决方案1】:

我不是 OO 程序员 .. 但是,作为概念证明,根据您的问题,您可以做/尝试这样的事情。

class Page {
    public $meta_title;
    public $meta_keywords;
    public $html_body;

    public function displayPage() {
        $page ='
        <html>
        <head>
            <title>'.$this->meta_title.'</title>
            <meta name="keywords" content="'.$this->meta_keywords.'" />
        </head>
        <body>
            '.$this->html_body.'
        </body>
        </html>
';
        echo $page;
    }
}

那你就用这个 Page 类作为 ..

$page = new Page();
$page->meta_title ="Hello world!";
$page->meta_keywords = "some text keywords";
$page->body = '<h1>Contact Us </h1>
<p>you can contact us at blah ... blah .. etc.</p>
<address>Dummy Address </address>
';

$page->displayPage();

请注意,您可以向其中添加很多东西,例如 .. 类变量(类型数组)来定义样式表、javascripts 文件 .. 然后您只需遍历它即可为各个页面动态定义这些文件。

您可以修改显示页面功能,使其适应左侧、右侧或顶部导航栏。然后你还可以使用 $show_right_bar、$show_left_bar 等变量来控制哪些页面显示哪个侧导航栏。因此,您可以修改和扩展您的任何要求。

或者,您可以尝试一些 php 框架,它们是更先进的解决方案,但这实际上取决于您的编程技能和您的要求。

希望这会有所帮助。

【讨论】:

  • 非常感谢您。这很简单,也很重要,正是我想要的。应该有更多的赞成票!
【解决方案2】:

我建议研究一些 PHP 框架,例如适合初学者的 Cake,或者如果您更熟练的话,可以使用 Symfony 或 Zend Framework。这些将大大简化您的 PHP 开发。

【讨论】:

    【解决方案3】:

    您可以将页面中的所有标签存储为多维数组。 PHP 足以做到这一点。因此,每个标签都将存储在数组的一个元素中。 然后,您可以使用控制语句根据某些条件在不同时间打印页面的不同部分。 它看起来有点像将 XML 文件转换为数组时得到的结果。 这就是我的想法。

    $page['html']['title'] = "Page's Title";
    $page['body']['p'][1] = "1st Paragraph";
    $page['body']['p'][2] = "2nd Paragraph";
    

    然后您可以使用自己的函数将这些作为 HTML 字段打印出来。

    【讨论】:

      【解决方案4】:

      我建议使用一些 MVC(模型、视图、控制器)框架,例如 KohanaPHP。本质上就是这样。您正在一个严格的面向对象环境中工作。 Kohana 中的一个简单页面,完全由一个类构建,如下所示:

      class Home_Controller extends Controller
      {
        public function index()
        {
          echo "Hello World";
        }
      }
      

      然后,您将通过访问您的 url、类名和方法名来访问该页面:

      http://www.mysite.com/home/index() 可以在 home/ 之后调用,但是是隐式的

      当您开始想要引入数据库活动时,您将开始使用另一个名为 Model 的类。这将包含与数据库交互的方法,如下所示:

      class Users_Model extends Model
      {
        public function count_users()
        {
          return $this->db->count_records('users');
        }
      }
      

      请注意,我没有编写自己的查询。 Kohana 带有直观的Query Builder

      该方法将从您的Controller 中调用,这是我们在此解决方案开头提到的第一个类。看起来像这样:

      class Home_Controller extends Controller
      {
        public function index()
        {
          $usersModel = new Users_Model;
          $userCount = $usersModel->count_users();
      
          echo "We have " . $userCount . " users!";
        }
      }
      

      最终,您会想要更复杂的布局,这将涉及 HTML/CSS/Javascript。此时,您将引入“Views”,它们只是表示层。与其在 Controller 中调用 echoprint,不如加载一个视图(本质上是一个 HTML 页面)并传递一些变量:

      class Home_Controller extends Controller
      {
        public function index()
        {
          $myView = new View("index");
          $usersModel = new Users_Model;
          $userCount = $usersModel->count_users();
      
          $myView->userCount = $userCount;
          $myView->render(TRUE);
        }
      }
      

      这将加载以下“视图”

      <p>We have <?php print $userCount; ?> users!</p>
      

      这应该足以让您入门。使用 MVC 风格非常干净,使用起来非常有趣。

      【讨论】:

        【解决方案5】:

        确实有很多方法可以做到这一点。

        当我制作一个简单的个人网站时,我通常在顶部有一个横幅,在一侧有一个菜单。为了避免自己必须复制'n'粘贴所有内容,我的 index.php 检查了一个 get 变量,并基于该 get 变量在中间加载适当的内容。例如,我的 index.php。我的菜单实际上是用一个功能加载内容的,但这不是必需的/不推荐的:

        <?php
        
        $page = strtolower($_GET['page']);
        if(!isset($page) || $page === '')
        {
            $page="home";
        }
        
        switch($page)
        {
            case "loomis":
                require_once("loomis.php");
                break;
            case "home":
            default:
                $page = "home";
                require_once("home.php");
                break;
        }
        
        include "menu.php";
        ?>
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
        <HTML>
        <HEAD>
        <TITLE>Nebulous - <?php getTitle($page) ?></TITLE>
        <link href="style.css" rel="stylesheet" type="text/css" />
        </HEAD>
        
        <body>
        <?php displayMenu() ?>
        </body>
        </html>
        

        类实际上只用作数据或功能的表示,而不是真正用于渲染页面。

        【讨论】:

          【解决方案6】:

          如果您在整个页面中都有静态的东西,OOP 在页面渲染中会很有用。 (例如页眉、页脚)

          $index = new Page();
          $index->displayHeader();
          // php/html per needs
          $index->displayFooter();
          

          这并不是那么直观,但正如其他人所说,可能性是巨大的。我建议买一本关于这个主题的书。

          【讨论】:

            【解决方案7】:

            实现目标的最佳方法是从 html 类开始。它的目的是编写任何 HTML 标记并正确缩进它们。这不是一项简单的任务,因为我几乎从未在网络上找到正确编写的此类 html 类。提示:您将需要一个堆栈来管理 HTML 标记的自动关闭,以及一个用于当前标记的工作缓冲区,该缓冲区滚动到一个更大的保持缓冲区中。

            使用 html 类的服务,您可以构建一个网页类,该类将从设置中创建页面。这里的诀窍是保持灵活性,不要在课堂上进行过多的硬编码。您需要一个用于基本设置的设置器,例如标题、作者、关键字等。将它们保存到一个数组中。然后 pages->header() 应该会自动输出页面的顶部。然后你应该使用webpage->heading($string,$size)等函数来创建标题,webpage->paragraph($text),webpage->image()等等。最后你只需要webpage->footer()。

            为了使网页类有价值,让它也创建 css。例如,如果您想使用引导程序,您可以让该类包含 css 并设置您的代码样式。请注意,您还可以让网页类创建高级对象,例如 pages->breadcrumbs() 或 webspage->pagination()

            【讨论】:

              【解决方案8】:

              我也有同样的想法,但找不到任何现代的 OO PHP 库来做我想做的事。我也想使用Foundation CSS framework,所以我编写了自己的 PHP 库并使用了多年。设置基本页面和菜单后,页面制作非常容易。在Packagist.org 上查看。我还编写了一个 PHP 文档库,因为我不喜欢任何现有的静态生成包及其复杂的设置。查看PHPFUI.com 以获取正在使用的库的示例。如果需要,通过 HTML 验证器运行 HTML。非常干净,因为在网站的构建过程中没有人手接触过 HTML。

              【讨论】:

                猜你喜欢
                • 2011-10-30
                • 2012-12-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-01-16
                相关资源
                最近更新 更多