使用 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;找不到
请帮我修复此命名空间问题。
非常感谢。
答案 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
文件结构
+ 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;整个代码。虽然这没有任何问题(这是自动加载器实际工作的方式),但它会缩短开发时间并减少错误。
我希望这会有所帮助。