PHP类奇怪的行为
我想知道这是一个PHP类奇怪的行为,php,class,object,Php,Class,Object,我想知道这是一个错误还是错误的实现。。。。。我尝试检查是否存在class\u 我的班级 namespace servers\testing ; class HelloWord { function hello() { echo "hello World" ; } } 测试 use servers\testing\HelloWord as OkWorld ; $okWolrd = new OkWorld() ; $helloWorld = new \
错误
还是错误的实现
。。。。。我尝试检查是否存在class\u
我的班级
namespace servers\testing ;
class HelloWord
{
function hello()
{
echo "hello World" ;
}
}
测试
use servers\testing\HelloWord as OkWorld ;
$okWolrd = new OkWorld() ;
$helloWorld = new \servers\testing\HelloWord() ;
var_dump($okWolrd); //object(servers\testing\HelloWord)[1]
var_dump(class_exists('servers\testing\HelloWord')); //true
var_dump(class_exists('OkWorld')); //false
$declearedClasses = get_declared_classes() ;
var_dump(in_array('servers\testing\HelloWord', $declearedClasses)); //true
var_dump(in_array('OkWorld', $declearedClasses)); //false
var_dump($okWolrd instanceof $helloWorld); //true but OkWolrd needed to be initiated before it works
问题:
这是否意味着OkWord
不是有效的PHP
类??请注意,new-OkWorld()
工作正常
如何验证OkWord
在没有减速的情况下是否存在
编辑1
我知道OkWorld
是一个别名
,但它是对servers\testing\HelloWord
的引用,这是一个有效的类
谢谢
OkWorld
不是一门课;它是一个名称空间别名。实际的类是HelloWord
OkWorld
不是类;它是一个名称空间别名。实际类是HelloWord返回false以检查OkWorld
是否为类有效,因为OkWorld
是别名,而不是实际类。您可以尝试改用:
返回false检查OkWorld
是否为类是有效的,因为OkWorld
是别名,而不是实际类。您可以尝试改用:
我认为这既不是一个bug,也不是一个错误的实现
OKWorld
不是一个类,它是一个别名,只要它存在,解释器就会用HelloWord
替换它。但是解释器不会搜索字符串,因此函数class_exists
将获取字符串OKWorld
,并搜索实际不存在的对应类!实际上存在的是一个别名。我认为这既不是一个bug,也不是一个错误的实现
OKWorld
不是一个类,它是一个别名,只要它存在,解释器就会用HelloWord
替换它。但是解释器不会搜索字符串,因此函数class_exists
将获取字符串OKWorld
,并搜索实际不存在的对应类!实际上存在的是一个别名。我同意这是一个别名
,但您的代码只有在OKWord
和initiated@MikePurcell第一个抛出致命(instanceof expects instance)@Poncha:有道理。别名基本上允许你简写类名,但是你仍然需要实例化它。在自动加载过程中会发生什么???这是不是意味着你必须实例化每个类,看看它是否存在??你怎么知道文件的路径???自动加载与你遇到的问题没有任何关系,文件的路径也没有关系。您的自动加载器设置为查看由include\u path
定义的某些目录。自动加载器仅使类可用,以便无需进行一次require\u
调用即可访问这些类。如果你要使用一个对象,你仍然必须实例化它,除非你使用的是该对象的静态属性。我同意是一个别名
,但你的代码只有在OKWord
和initiated@MikePurcell第一个抛出致命(instanceof expects instance)@Poncha:有道理。别名基本上允许你简写类名,但是你仍然需要实例化它。在自动加载过程中会发生什么???这是不是意味着你必须实例化每个类,看看它是否存在??你怎么知道文件的路径???自动加载与你遇到的问题没有任何关系,文件的路径也没有关系。您的自动加载器设置为查看由include\u path
定义的某些目录。自动加载器仅使类可用,以便无需进行一次require\u
调用即可访问这些类。如果你要处理一个对象,你仍然必须实例化它,除非你处理的是这个对象的静态属性。我知道。。。问题是如何验证该别名是否存在。。。因为它被视为有效的Class@Baba:为什么要测试别名是否存在?你想完成什么?好的,这只能通过反射来完成。你有一个REST服务,用户需要远程指向一个类。。。而不必放置名称空间。。它的清洁剂使用别名。。。如果您想开发和自动加载classed..的另一个示例。。并使用别名而不是完整路径。。什么happens@Baba:自动加载不使用别名。您可以通过添加函数uu autoload($class){var_dump($class);}
并尝试使用别名类来检查这一点。传递给自动加载器的内容是原始类而不是别名。+1。。。。不错的一个@drrcknlsn。。。。我注意到自动加载根本没有捕获别名。。这意味着谁。。。您不能自动加载
别名。。。这比我当时预料的要糟糕得多…我知道。。。问题是如何验证该别名是否存在。。。因为它被视为有效的Class@Baba:为什么要测试别名是否存在?你想完成什么?好的,这只能通过反射来完成。你有一个REST服务,用户需要远程指向一个类。。。而不必放置名称空间。。它的清洁剂使用别名。。。如果您想开发和自动加载classed..的另一个示例。。并使用别名而不是完整路径。。什么happens@Baba:自动加载不使用别名。您可以通过添加函数uu autoload($class){var_dump($class);}
并尝试使用别名类来检查这一点。传递给自动加载器的内容是原始类而不是别名。+1。。。。不错的一个@drrcknlsn。。。。我注意到自动加载根本没有捕获别名。。这意味着谁。。。您不能自动加载
别名。。。这比我当时预料的要糟糕得多请
// Not sure if this works (haven't used namespace aliases yet)
//var_dump('OkWorld' instanceof HelloWorld); // No GOOD - Throws fatal
// This will work
$okWorld = new OkWorld();
var_dump($okWorld instanceof HelloWorld);