Php 我可以使用没有include或require语句的类吗?

Php 我可以使用没有include或require语句的类吗?,php,namespaces,Php,Namespaces,我有一个index.php: <?php include_once('X\X.php'); $y= new X\X(); $y->HelloWorld(); ?> 假设index.php位于文件夹ROOT中,那么在ROOT\X中我有一个名为:X.php的文件: <?php namespace X; class X{ public function HelloWorld(){ echo 'Hello!';

我有一个index.php:

<?php

include_once('X\X.php');

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

?>

假设index.php位于文件夹ROOT中,那么在ROOT\X中我有一个名为:X.php的文件:

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

我的问题是,只有在index.php中有include_ux('X\X.php')时,这才有效。还有什么可以打招呼的吗!不包括文件

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

您可以使用不包含名称空间的名称空间。这不是真正的建议,但可以做到

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

一旦有了它,就可以合法地(尽管我再说一次,不推荐)在同一个文件中进一步更改名称空间(当然,显然是在任何类或函数之外)


我真的建议您花点时间来学习PHP的自动加载机制,作为这一学习练习的一部分。它与名称空间配合得非常好,允许您为每个类将代码拆分为单独的文件(根据最佳实践建议),但无需手动包含所需的每个文件。

您可以使用名称空间,而无需包含。这不是真正的建议,但可以做到

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

一旦有了它,就可以合法地(尽管我再说一次,不推荐)在同一个文件中进一步更改名称空间(当然,显然是在任何类或函数之外)

我真的建议您花点时间来学习PHP的自动加载机制,作为这一学习练习的一部分。它与名称空间配合得非常好,允许您为每个类将代码拆分为单独的文件(根据最佳实践建议),但无需手动包含所需的每个文件。

了解()和friends,或者更确切地说是Spl自动加载机制以及
include\u path
ini指令。这是很酷的东西,可以帮你省去很多麻烦

然而,自动加载并不是魔术。它只是一种“钩子”技术,Zend引擎在访问用户定义的类时调用这种技术,以前从未包含过。自动加载方法的参数是类名。该方法必须将类名解析为文件名,并使用include或require(*\u 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();
正如您所看到的,虽然自动加载简化了类的使用并包含“后台”文件,但仍然需要包含它们。因此,这个问题的答案是:在使用类文件之前,您必须包含它们

了解()和朋友,或者更好地说,了解Spl自动加载机制以及
include\u path
ini指令。这是很酷的东西,可以帮你省去很多麻烦

然而,自动加载并不是魔术。它只是一种“钩子”技术,Zend引擎在访问用户定义的类时调用这种技术,以前从未包含过。自动加载方法的参数是类名。该方法必须将类名解析为文件名,并使用include或require(*\u 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();

正如您所看到的,虽然自动加载简化了类的使用并包含“后台”文件,但仍然需要包含它们。因此,这个问题的答案是:在使用类文件之前,您必须包含它们。

@Koray Tugay还想知道我遗漏了什么。但是,在没有例子和最后一个例子的情况下,它被否决了paragraph@KorayTugay也请注意我在接受答案下面的评论。只是为了给你指出正确的方向。你不能指望PHP包含任何东西you@Koray图盖也想知道我错过了什么。但是,在没有例子和最后一个例子的情况下,它被否决了paragraph@KorayTugay也请注意我在接受答案下面的评论。只是为了给你指出正确的方向。你不能指望PHP包含任何东西,只有Chuck Norris可以访问类而不包含它们。使用自动加载机制并不意味着程序员不需要包含该文件。与java不同,java的编译器执行include@hek2mgl-是的,你是对的(我喜欢你的Chuck Norris钻头)。但是为了回答这个问题,我把它简化了,否则我会再花二十分钟写一些偏离原问题主题的东西。只有Chuck Norris可以访问不包含它们的类。使用自动加载机制并不意味着程序员不需要包含该文件。与java不同,java的编译器执行include@hek2mgl-是的,你是对的(我喜欢你的Chuck Norris钻头)。但为了回答这个问题,我把它简化了,否则我会再花二十分钟写一些偏离原问题主题的东西。