2

我有一个 index.php:

<?php

include_once('X\X.php');

$y= new X\X();
$y->HelloWorld();

?>

并说 index.php 在文件夹 ROOT 中,然后在 ROOT\XI 中有一个名为:X.php 的文件:

<?php 
namespace X;
     class X{
        public function HelloWorld(){
            echo 'Hello!';
        }
    }
?>

我的问题是,这只有在我的 index.php 中有 include_('X\X.php') 时才有效。反正有没有打个招呼!不包括文件?

我正在尝试学习名称空间以及它们的实际使用方式。如果我已经包含了该文件,那么为什么还要使用命名空间呢?

4

2 回答 2

3

您可以使用没有包含的命名空间。这不是真的推荐,但可以做到。

给定的 PHP 文件必须是完全命名空间或根本没有命名空间。因此,如果您要在文件中包含名称空间,它必须以名称空间声明开始(即第一行代码)。

一旦你有了它,在同一个文件中进一步更改命名空间是合法的(尽管我会再说一遍,不推荐)(当然,显然在任何类或函数之外)。

我真的建议花时间学习 PHP 的 Autoload 机制,作为同一学习练习的一部分。它与命名空间很好地结合在一起,并允许您将代码拆分为每个类的单独文件(根据最佳实践建议),但无需手动包含您需要的每个文件。

于 2013-01-18T20:40:16.927 回答
1

了解spl_autoload_register () 和朋友,或者更确切地说,将 Spl 自动加载机制与include_pathini 指令一起学习。那是很酷的东西,会为您省去很多麻烦!:)

然而,自动加载并不神奇。它只是 Zend 引擎在访问以前未包含的用户定义类时调用的“挂钩”机制。自动加载方法的参数是类名。该方法必须将类名解析为文件名使用 include 或 require (*_once) 将其包含在内。

假设在您的情况下,文件 X.php 将位于类路径中某处的文件夹 X 中,您可以像这样解析名称:

// define your autoloader
function the_autoloader($classname) {
    // $classname  will 'X\X' in the example
    $filename = str_replace('\\', '/', $classname) . '.php';
    require $filename;
}

// register the autoloader
spl_autoload_register('the_autoloader');


// from this point you are free to instantiate every class
// that can be resolved by the_autoloader() without writing 
// an explicit include statement

$y= new X\X();
$y->HelloWorld();

如您所见,尽管自动加载简化了类的使用并“在后台”包含文件,但仍然需要包含它们。所以问题的答案是:您必须在使用类文件之前包含它们

于 2013-01-18T20:45:52.593 回答