【问题标题】:Importing PHP Namespace To Extend A Class In That Namespace导入 PHP 命名空间以扩展该命名空间中的类
【发布时间】:2012-01-08 09:53:09
【问题描述】:

这篇文章是由于我在从第二个命名空间扩展第一个命名空间中定义的类时遇到的一些困难。基于这篇文章:

PHP how to import all classes from another namespace

我试过这个:

文件命名空间1:

<?php
namespace FirstNS;

class baseObject
{
    public $baseVar = 1;

public function baseFun() {}
}

?>

文件命名空间2:

<?php
namespace SecondNS;

use FirstNS;

class extendedObject extends FirstNS\baseObject {
    public $extendedVar = 1;

    public function extendedFun() {

    }
}

?>

但是extendedFun中的$this只能访问$extendedVarextendedFun,不能访问$baseVarbaseFun。我也试过use FirstNS as ClassFromFirstNS;class extendedObject extends ClassFromFirstNS 但是$baseVarbaseFun 仍然无法通过$this 访问。 http://www.php.net/manual/en/language.namespaces.rationale.phphttp://www.php.net/manual/en/language.namespaces.definition.phphttp://www.php.net/manual/en/language.namespaces.importing.php 上的信息似乎也没有直接解决这个案例。

【问题讨论】:

  • 你是如何实例化对象的? $object = new baseObject()$object = new extendedObject()?
  • @Digital Precision,这只是在类扩展定义中。如果这些都在一个文件中,像这样: $baseVar 和 baseFun 可以从extendedFun 中访问。这是为了尝试了解在从不同文件访问命名空间时需要哪些命名空间声明才能使 $baseVar 和 baseFun 可访问。
  • 命名空间或多或少与可见性无关。它们只是扮演类名的角色,并允许您为每个命名空间中的所有类和函数名添加前缀。

标签: php class namespaces


【解决方案1】:

我没有任何问题可以让您的代码正常工作,您的问题并不清楚您的问题出在哪里:

namespace FirstNS
{
    class baseObject
    {
        public $baseVar = 1;    
        public function baseFun() {}
    }
}

namespace SecondNS
{
    use FirstNS;
    class extendedObject extends FirstNS\baseObject
    {
        public $extendedVar = 1;
        public function extendedFun()
        {
            echo $this->extendedVar, "\n"; # works
            $this->baseFun(); # works
        }
    }

    echo '<pre>';
    $obj = new extendedObject();
    echo $obj->baseVar, "\n"; # works
    $obj->extendedFun();
}

Demo - 希望这会有所帮助。

【讨论】:

  • 您的解决方案有效,因为它都在同一个文件中,OP 声明它跨 2 个文件。
  • 这一切都在一个文件中吗?在第二个文件中,我也尝试过: namespace SecondNS;包括'NameSpace1.php';使用第一NS;根据php.net/manual/en/language.namespaces.faq.php,但是基类的成员仍然没有出现。
  • 啊啊啊,讨厌这种情况。
  • @LiteratiInsolitus 两个文件示例(eval 就像包含):codepad.viper-7.com/FlzgKO - 你只是在看错误的点。简化您的示例并开始 w/o 命名空间,因为实际上命名空间与此无关。无论您尝试什么,您还应该将完整代码添加到问题中。我在您的问题中看不到您访问某些内容的任何地方,也没有提供任何错误消息。但这些绝对重要。
【解决方案2】:

试一试:

// File1.php
namespace FirstNS;

class baseObject
{
     public $baseVar = 1;

     public function baseFun() {}
}

// File2.php
namespace SecondNS;

include 'File1.php';

use FirstNS;

class extendedObject extends FirstNS\baseObject {

    public $extendedVar = 2;

    public function extendedFun()
    {
        var_dump($this->baseVar); // Outputs 1
        var_dump($this->extendedVar); // Outputs 2    
    }
}

// File3.php
include 'File2.php';

$object = new SecondNS\extendedObject();

$object->extendedFun();

【讨论】:

  • 我已经尝试包含原始文件,并且我现在尝试了您的 file1 和 file2 的代码,@Digital Precision,但是从扩展对象定义中看不到 baseClass 成员。
  • @LiteratiInsolitus:更新代码,检查extendedFun() 方法。在我的测试中工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 2014-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多