PHP中是否有任何反射/内省/魔术可以让你找到定义特定类(或函数)的PHP文件?
换句话说,我有一个PHP类的名称,或一个实例化的对象.我想将此传递给某些东西(函数,Reflection类等),它将返回定义类的文件系统路径.
/path/to/class/definition.php
Run Code Online (Sandbox Code Playgroud)
我意识到我可以使用(get_included_files())
获取到目前为止已包含的所有文件的列表,然后手动解析它们,但这是一次尝试的大量文件系统访问.
我也意识到我可以在我们的__autoload机制中编写一些额外的代码来缓存这些信息.但是,在我想到的情况下,修改现有的__autoload是不受限制的.
听说可以做到这一点的扩展会很有趣,但我最终会喜欢可以在"库存"安装上运行的东西.
由于我使用PECL安装了APC for PHP,我有时会遇到以下错误: Cannot redeclare class xxx
xxx不时变化.我可以禁用APC,但APC可以提高性能!是否存在已知错误或我可以采取其他措施来防止这些错误?我正在使用Ubuntu 8.04 LTS和PHP 5.2.4.
编辑/更新(来自评论):
我使用Zend Framework Autoloader,在启用APC之前从未发生过这些错误.不久前我得到了这个错误:Fatal error: require(): Cannot redeclare class zend_db_adapter_abstract in /paths/app/lib/Zend/Db/Select.php on line 27
使用时php artisan tinker
,我在项目中更改了一些类文件.有没有办法重新加载REPL,而不必键入exit
并php artisan tinker
再次?
我在文件B.inc中有一个函数A.
line 2: function A() {
...
line 10: }
Run Code Online (Sandbox Code Playgroud)
在apache日志中:
PHP致命错误:无法在第10行的B中重新声明A()(之前在B.inc:2中声明)
我想测试phpDocumentor-alpha,并且有一些人似乎没有问题:
# sudo pear uninstall phpdoc/phpDocumentor-alpha
uninstall ok: channel://pear.phpdoc.org/phpDocumentor-2.0.0a6
olivier@olivier-ubuntu ~/Documents/pizzas/dev # phpdoc --help
bash: /usr/bin/phpdoc: Aucun fichier ou dossier de ce type
#
# sudo pear install --alldeps -f phpdoc/phpDocumentor-alpha
downloading phpDocumentor-2.0.0a6.tgz ...
Starting to download phpDocumentor-2.0.0a6.tgz (1,107,853 bytes)
..................................done: 1,107,853 bytes
install ok: channel://pear.phpdoc.org/phpDocumentor-2.0.0a6
# phpdoc --help
PHP Fatal error: Cannot redeclare class phpDocumentor\Plugin\Core\Listener in /usr/share/php/phpDocumentor/src/phpDocumentor/Plugin/Core/Listener.php on line 194
Fatal error: Cannot redeclare class phpDocumentor\Plugin\Core\Listener in /usr/share/php/phpDocumentor/src/phpDocumentor/Plugin/Core/Listener.php on line 194
#
Run Code Online (Sandbox Code Playgroud)
好的,我可以避免这个问题:
if ( !class_exists('MTIHelperEstadosLocal') ) …
Run Code Online (Sandbox Code Playgroud) 我需要在整个代码中多次包含对另一个php文件example.php的引用,但是我得到"PHP致命错误:无法重新声明类错误".
<?php include 'example.php'; ?>
Run Code Online (Sandbox Code Playgroud)
怎么做到这一点?