2017-05-29 42 views
1

我在学习并试图理解在PHP中使用namespaceuse。我也在php.net documentation上使用spl_autoload_register。我仍然对使用它并产生错误感到困惑。PHP - spl_autoload_register不使用`namespace`和`use`

我有我的教程文件夹2个文件:

  1. php_oop.php
  2. tutor.php

php_oop.php

<?php 
namespace php_oop; 

class php_oop 
{ 
    public function __construct($name){ 
     $this->name = $name; 
    } 

    public function get(){ 
     return $this->name; 
    } 
} 

tutor.php

​​

输出

Warning: The use statement with non-compound name 'php_oop' has no effect in C:\xampp\htdocs\tutorial\oop\tutor.php on line 9 string(7) "php_oop" Fatal error: Class 'php_oop' not found in C:\xampp\htdocs\tutorial\oop\tutor.php on line 11

我想知道如何正确使用它呢?

+0

类名的第一个字母必须是大写。 – Nidhi

+2

这只是一种文体,@Nidhi。 – Bytewave

回答

2

use不像import。你必须use你正在使用的每个课程,不是每个命名空间。对于你的榜样,那就是:

use php_oop\php_oop; 

这会从php_oop命名空间导入的php_oop类。

请参阅the documentation for importing namespaces了解更多信息和有用的提示。

(副作用:该$class_name传递给spl_autoload_register的回调包含其中包括命名空间中的类全名磁带自动加载机正确加载类,你要么需要改变你的自动加载代码或移动php_oop.php。文件到名为php_oop的文件夹以匹配它来自的名称空间。)

+0

感谢您的详细信息。我设法通过创建一个像你建议的文件夹来得到它。如果我想更改我的自动加载器代码,是否需要手动指定文件名,如'include'php_oop.php';' – Amran

+0

不,因为这不会是一个自动加载器;)。如果你真的想做这样的事情,你可能想用'\'或其他东西来'爆炸',并把结果数组中的最后一个字符串。但通过名称空间保持有组织的文件夹结构更适合碰撞,并更符合标准。 – Bytewave

+0

我想重新确认关于命名空间,它是否必须与我们的文件名相同 – Amran

相关问题