PHP方法消失了?
我使用PHP的PHP方法消失了?,php,class,methods,require-once,Php,Class,Methods,Require Once,我使用PHP的require\u once()方法将一个PHP脚本包含到另一个脚本中。此脚本包含一个名为TemplateAdmin的类,该类在脚本之后立即实例化自身,如下所示: class TemplateAdmin { // Class body... } $templateAdmin = new TemplateAdmin(); 这在一段时间内运作良好。但是,我采用了一种新的导入技术来包含类和包。我已经测试了这项新技术,它很有效!然而,出于某种奇怪的原因,我导入的任何类中的方法在我需要时
require\u once()
方法将一个PHP脚本包含到另一个脚本中。此脚本包含一个名为TemplateAdmin的类,该类在脚本之后立即实例化自身,如下所示:
class TemplateAdmin {
// Class body...
}
$templateAdmin = new TemplateAdmin();
这在一段时间内运作良好。但是,我采用了一种新的导入技术来包含类和包。我已经测试了这项新技术,它很有效!然而,出于某种奇怪的原因,我导入的任何类中的方法在我需要时都不存在。然而,似乎实例变量仍然存在
例如,当调用具有此绝对路径的类时:
require_once("C:\wamp\www\wave_audio\system\server\templates\TemplateAdmin.php");
。。。我在调用堆栈中遇到此错误:
Fatal error: Call to undefined method stdClass::top() in C:\wamp\www\wave_audio\cms\index.php on line 189
此错误是指我在TemplateAdmin
类中使用了top()
方法
有人知道为什么会这样吗???如果这有帮助的话,我一直在使用require\u once()
,我正在Windows XP Media Center机器上运行PHP 5.3.5
谢谢你抽出时间 我感觉您的php错误消息是准确的。我知道在你的精简版上,你是如何拼凑起来的,你确定它是安装好的,但它显然不是直接复制/粘贴的,因为它类似于:
class TemplateAdmin {
public function top() {
//The "top" method...
}
}
因此,错误消息表示未定义方法“top”。如果它没有正确地包含您的文件,它会告诉您实例化的类不存在。要么该方法不存在于您认为它存在的类中,要么该方法已在该对象实例中的某个位置取消设置。信任您的错误消息 假设您不想在这里使用globals,这是一种只需要少量更改的方法 TemplateAdmin.php:
class TemplateAdmin {
// Class body...
}
return new TemplateAdmin();
退货包括一次导入:
function import($classes) {
//Convert ECMAScript style directory structures to Unix style
$address = str_replace(".", "/", $classes);
$address = INSTALL_ROOT . "system/server/" . $address . ".php";
if (file_exists($address) && is_file($address)) {
return require_once($address);
} else {
die(""" . $classes . "" does not link to an existing class");
}
}
分配变量:
$adminTemplate = import('templates.TemplateAdmin');
如果你能展示完整的相关源代码(你在哪里做需求,你在哪里调用top())……你能把你的代码减少到一个最小的测试用例,然后把它发布到这里吗?它太长了,不能包含整个脚本,但我可以向你保证,在调用方法之前会导入脚本。它可以工作,因为我已经尝试回显包含文件中的一些文本,在收到错误之前,这些文本会显示在我的屏幕上。我将试着把它归结为一个简化的版本…:)在
import()
函数中是否有require\u once()
?我想这可能是您的问题$templateAdmin
被困在import
函数中。嗯。。。谢谢玻璃机器人!我得调查一下。理想情况下,我希望使用import('templates.TemplateAdmin')
作为require\u once(/*完整路径*/)
的快速替代方法,而不将其内容分配给变量,并使其以完全相同的方式运行。你知道这种事情是可能的吗?