v); } -6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:03:08 26 4
gpt4 key购买 nike

一起学习PHP Namespaces 但坚持基础。下面是我的类(class)

<?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(); 

Fatal error: Class 'NS\getList' not found


具有合格名称
$o_ = new H\getList();

Fatal error: Class 'NS\H\getList' not found


具有完全限定名称
$o_ = new NS\H\getList(); 

Fatal error: Class 'NS\NS\H\getList' not found


请帮我解决这个命名空间问题。
非常感谢你。

最佳答案

类和命名空间

首先,您正在尝试 实例化 你的类(class)“方法”。这是不可能的。相反,您实例化 先是你的“类(class)”,然后才是你 调用你的“方法”。
http://php.net/manual/en/language.oop5.basic.php

接下来,如果您不使用自动加载器,您必须“包含”或“要求”包含您希望使用的类的文件。
http://php.net/manual/en/function.include.php
http://php.net/manual/en/function.require.php

实例化和方法调用

文件结构

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

文件“H.php”
<?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();
}
}

文件“Test.php”
<?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

文件 'Test.php' - 选项 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();

?>

文件“Test.php” - 选项 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();

?>

文件“Test.php” - 选项 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();

?>

文件“Test.php” - 选项 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

使用自动加载器无需在整个代码中编写“include”和“require”。虽然这没有任何问题(这是自动加载器实际工作的方式),但它将缩短开发时间并减少错误。

我希望这有帮助。

关于namespaces - 如何使用命名空间访问类成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28105363/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com