如何使用命名空间访问类成员?

时间:2015-01-23 07:56:43

标签: namespaces php-5.5 class-method

使用 PHP Namespaces 学习,但坚持基础知识。下面是我的班级

<?php namespace NS;

class H {

    public $v = 'now';
    public static $v_ = 'static';

    public function pm() {
       printf("<br/>public %s; variable v:%s", __METHOD__, $this->v);
    }

    public function getList()
    {
        printf("<br/> %s; Variable md5: %s", __METHOD__, md5($this->v));
    }

    public static function gl_()
    {
       printf("<br/> %s ; var: %s ; static: %s", __METHOD__, $this->v, self::$v_);
       self::getList();
    }


}

创建了一个类对象(工作正常)

$o = new H;
var_dump($o); // object(NS\H)[1]  public 'v' => string 'now' (length=3)

现在,当我尝试访问类方法(暂时公开)时,可以从 namespace documentation

获取帮助

,具有非限定名称

$o_ = new getList(); 

给出

  

致命错误: Class&#39; NS \ getList&#39;找不到

,具有合格名称

$o_ = new H\getList();

给出

  

致命错误: Class&#39; NS \ H \ getList&#39;找不到

,具有完全限定名称

$o_ = new NS\H\getList(); 

给出

  

致命错误: Class&#39; NS \ NS \ H \ getList&#39;找不到

请帮我修复此命名空间问题。

非常感谢。

1 个答案:

答案 0 :(得分:1)

类和命名空间

首先,您尝试 实例化 您的课程&#39;方法&#39;。这是不可能做到的。相反,您 实例化 您的班级&#39;首先,您 致电 您的方法&#39;。
http://php.net/manual/en/language.oop5.basic.php

接下来,如果您不使用自动加载器,则必须包含&#39;或者&#39;要求&#39;包含您要使用的课程的文件 http://php.net/manual/en/function.include.php
http://php.net/manual/en/function.require.php

实例化&amp;方法调用

文件结构

+ Test.php   (file)
+ NS         (directory)
   + H.php   (file)

档案&#39; H.php&#39;

<?php

namespace NS;

class H
{
    public $v = 'now';
    public static $v_ = 'static';

    public function pm()
    {
        printf("<br/>public %s; variable v:%s", __METHOD__, $this->v);
    }

    public function getList()
    {
        printf("<br/> %s; Variable md5: %s", __METHOD__, md5($this->v));
    }

    public static function gl_()
    {
       printf("<br/> %s ; var: %s ; static: %s", __METHOD__, $this->v, self::$v_);
       self::getList();
    }
 }

文件&#39; Test.php&#39;

<?php

// Include the file.
include 'NS\H.php'; // Delete if using an autoloader.

// Instantiate the object.
$o = new NS\H(); // Note: The 'NS\' (being your namespace and separator) after the 'new' keyword.
                 //       The '()' are required after your class name.

// Call the objects method.
$o->getList();

?>

命名空间

其次,关于名称空间问题,有多种方法可以做到这一点 http://php.net/manual/en/language.namespaces.php

文件&#39; Test.php&#39; - 选项1(如上所示)

<?php

// Include the file.
include 'NS\H.php'; // Delete if using an autoloader.

// Instantiate the object.
$o = new NS\H();

// Call the objects method.
$o->getList();

?>

文件&#39; Test.php&#39; - 选项2

<?php

// Include the file.
include 'NS\H.php'; // Delete if using an autoloader.

// Alias the class.
use NS\H;

// Instantiate the object.
$o = new H();

// Call the objects method.
$o->getList();

?>

文件&#39; Test.php&#39; - 备选方案3

<?php

// Include the file.
include 'NS\H.php'; // Delete if using an autoloader.

// Alias the class.
use NS\H as H; // Exactly the same outcome as option 2.

// Instantiate the object.
$o = new H();

// Call the objects method.
$o->getList();

?>

文件&#39; Test.php&#39; - 备选方案4

<?php

// Include the file.
include 'NS\H.php'; // Delete if using an autoloader.

// Alias the class.
use NS/H as Abc;

// Instantiate the object.
$o = new Abc();

// Call the objects method.
$o->getList();

?>

自动加载(额外阅读)

最后,当使用自动加载器时,上述所有内容都非常好 http://php.net/manual/en/language.oop5.autoload.php

使用自动加载器无需编写&#39; include&#39;并且要求&#39;整个代码。虽然这没有任何问题(这是自动加载器实际工作的方式),但它会缩短开发时间并减少错误。

我希望这会有所帮助。