【问题标题】:Using PHP Namespaces使用 PHP 命名空间
【发布时间】:2011-05-08 08:32:20
【问题描述】:

我一直在搜索网站以尝试了解如何使用 PHP 命名空间,但它们看起来都非常模糊,但他们想要做的事情很容易理解!

我的问题是:我有一个名为people.php 的文件,其中定义了一个名为people 的类。如果我在同一文件夹中创建另一个名为 managers.php 的文件,我是否可以再次定义一个名为 people 的类,它扩展了原始 people 类但在 managers 的命名空间中,如果是这样,我必须“包含”原始people.php,如果是这样,我是否将包含在写作之后:namespace managers

【问题讨论】:

  • 有一点需要注意,PHP 中的命名空间并不反映您的目录结构。您必须手动将目录结构与命名空间名称进行映射。
  • This 将是一个很好的资源来清除您需要了解的有关 PHP 命名空间的所有信息。

标签: php namespaces


【解决方案1】:
// people.php
<?php
namespace People;

class People {}


// managers.php
<?php
namespace Managers;

require_once __DIR__.'/people.php';

class People extends \People\People {}

【讨论】:

    【解决方案2】:

    命名空间是一种将相关类分组到包中的方法。你所描述的最好放在一个单一的命名空间下,比如

    <?php // people.php
    namespace com\example\johnslibrary\people;
    abstract class People {
    
    }
    

    然后

    <?php // manager.php
    namespace com\example\johnslibrary\people;
    require_once 'path/to/People.php'; // can better use autoloading though
    class Manager extends People {
    
    }
    

    因为 Manager 是 People 的子类,所以没有太多理由将它们放入自己的命名空间中。他们是专业人士。

    如果您希望 Managers 位于他们自己的命名空间中,您可以这样做,但在使用 extends 关键字时必须使用完全限定名称,例如

    <?php // manager.php
    namespace com\example\johnslibrary\managers;
    require_once 'path/to/People.php';
    class Manager extends \com\example\johnslibrary\people\People {
    
    }
    

    或者先导入 People 类

    <?php // manager.php
    namespace com\example\johnslibrary\managers;
    use com\example\johnslibrary\People as People;
    require_once 'path/to/People.php';
    class Manager extends People {
    
    }
    

    See the PHP Manual on Namespaces for extensive documentation.

    【讨论】:

      【解决方案3】:

      我有旧的 PHP 类,我需要在新的 PHP 文件中使用它,例如:index.php 必须使用 iClass.php。但在使用旧的 iClass.php 之前,我必须将其修改如下,以便我可以在 index.php 中使用它。

      iClass.php:

      namespace ic;
      class iClass {
        public static function callMeFromClass() {
          echo 'OK - you have called me!';
          exit;
        }
      }
      

      index.php

      namespace inex;
      require_once 'iClass.php';
      use ic\iClass;
      iClass::callMeFromClass();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-19
        • 2017-07-18
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多