Php 我可以使用没有include或require语句的类吗?
我有一个index.php: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!';
<?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钻头)。但为了回答这个问题,我把它简化了,否则我会再花二十分钟写一些偏离原问题主题的东西。