【问题标题】:PHP Namespace ClassPHP 命名空间类
【发布时间】:2014-08-12 11:08:47
【问题描述】:

我阅读了很多关于 PHP 命名空间的内容,但我仍然感到困惑。

我在命名空间实体(A 类)下的不同文件夹中有一个类。

我在同一命名空间(B 类)下的不同文件夹中有另一个类,并扩展了 A 类。

我收到一条错误消息,提示找不到 A 类。

我的主要问题是 - 在创建 B 类的新实例时是否必须包含 A 类?

这是我的代码: (甲级)

 namespace Entity;
    //Framework/Entity/BaseModel.php
    class BaseModel { 

      //TODO: IMPLEMENT THIS
      public function GetList() {
        return null;
      }

    } 

(B类)

namespace Entity;
//Models/Points.php
class Points extends BaseModel{
    public $Id = null;
}

(主文件)

 require_once(dirname(dirname(__FILE__)) . '/Models/Points.php');
  $points = new Points();

【问题讨论】:

    标签: php class inheritance namespaces extend


    【解决方案1】:

    命名空间与实际包含文件无关,这是两个完全独立的机制。所以,是的,您仍然需要require_once 定义该类的文件才能使用它。

    话虽如此,特别是对于命名空间,通常会使用自动加载器,因此您不必编写大量 require 代码。如果您将类文件完全按照它们的名称空间组织在文件夹中,那么自动加载它们的文件非常容易。见http://php.net/manual/en/language.oop5.autoload.phphttps://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md

    【讨论】:

      【解决方案2】:

      父类定义必须知道子类的定义。 甚至在您创建子类的实例之前。

      否则 PHP 怎么知道在你创建的类中放什么?

      require_once('BaseModel.php')
      namespace Entity;
      //Models/Points.php
      class Points extends BaseModel{
          public $Id = null;
      }
      

      【讨论】:

      • 是的,这是有道理的,包括在孩子之前的父母。
      • 在包含包含定义的文件时导入类。 includerequirerequire_once - 选择一个。答案中的样本。或者学习如何使用自动加载器(恕我直言更好的解决方案)。
      猜你喜欢
      • 2016-03-25
      • 2012-01-12
      • 2012-08-10
      • 2011-09-04
      • 2012-08-10
      • 2010-11-27
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多