【问题标题】:Is require/include, in multiple files, necessary if they are all part of the same namespace?如果它们都是同一个命名空间的一部分,那么在多个文件中是否需要/包含?
【发布时间】:2012-03-30 06:51:55
【问题描述】:

我对 php 中的命名空间概念是全新的。

情况: 一个文件夹中有多个文件,它们都需要/包含彼此以用于各自的目的。

如果我将它们全部放在同一个命名空间中,是否仍然需要让它们相互要求/包含?

我确实想过用“use”替换 require/include,但在命名空间 foo\bar 中有一个文件来实际“使用”foo\bar 似乎很奇怪...... o_O

PS: 我通过提问来覆盖我的所有基础,同时也在网上寻找答案;因此,如果您有任何好的信息/教程等来源,请随时分享。 :D

谢谢你, 大卫

【问题讨论】:

    标签: php namespaces


    【解决方案1】:

    它可能会因所有包含/要求而变得混乱。一个包含文件中的包含文件也将包含在第一个文件中,而无需显式调用它。我建议,如果您使用 OOP 方法,请从使用 __autoload() 魔术方法开始。当您在一个页面上包含一个已经包含在该页面上运行的其他地方的文件时,这将为您省去很多麻烦,因此您会收到 500 服务器错误。

    【讨论】:

      【解决方案2】:

      是的,你必须要求他们,或者你可以使用psr-0 compatible autoloader

      【讨论】:

      • 感谢您的回答。我设法根据您和 JT Smith 的回答制定了解决方案。
      【解决方案3】:

      如果我将它们全部放在同一个命名空间中,是否仍然需要让它们相互要求/包含?

      例如,您可以创建一个加载器类(这是我一直在做的,因此您只需包含/要求它们一次,并且您只需在控制器中包含/要求加载器类)。这是我目前正在使用的:

      <?php
      error_reporting(E_ALL);
      ini_set('display_errors', '1');
      
      //include alle classes
      include("classes/db.class.php");
      include("classes/gastenboek.class.php");
      include("classes/gebruiker.class.php");
      include("classes/bericht.class.php");
      
      session_start();
      
      $db = new Db();
      
      //require smarty (smarty template engine)
      require('plugins/smarty/Smarty.class.php');
      
      $smarty = new Smarty;
      $smarty->setCompileDir('smarty_compile');
      $smarty->setTemplateDir('templates');
      
      //func to dump var
      function dump($var)
      {
          //echo ##
          echo '<pre>##';
          //print var
          print_r($var);
          //echo ##
          echo '##</pre>';
      }
      

      以 db.class 为例:

      <?php
      class Db
      {
          //Loading Db
          public function __construct()
          {
              //do connect()
              $this->connect();
          }
      
          //connecting and selecting db
          private function connect()
          {
              $connection = mysql_connect('localhost', 'user', 'pw');
      
              if(!$connection)
              {
                  die("Kan geen verbinding maken: " . mysql_error());
              }
      
              mysql_select_db("db", $connection);
          }
      
          public function DBH()
          {
              try 
              {
                  $DBH = new PDO('mysql:host=localhost;dbname=dbname', 'user', 'pw');
                  $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                  return $DBH;
              }
      
              catch (PDOException $except)
              {
                  echo $except->getMessage();
              }
          }
      

      index.php 将只需要这个:

      include("includes/loader.php");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-20
        • 1970-01-01
        • 2015-05-16
        • 1970-01-01
        • 2018-10-16
        • 2012-08-30
        • 2011-03-21
        • 1970-01-01
        相关资源
        最近更新 更多