OOP没有被初始化到变量中以便以后访问对象


OOP not being initiated into variable for later object access

我觉得这是一个愚蠢的错误,但它让我在过去的24小时里停滞不前;我有一个类,它在我使用的其他页面上都能完美地工作。我现在正在使用这个类的一个非常小的版本,同时为PayPal订阅创建一个IPN侦听器。

我遇到的问题是,在一个变量中创建了一个新的类实例(与我在所有其他页面上所做的完全相同),然后尝试访问它后,我收到一个错误,说我试图使用一个非对象变量作为对象。

浓缩版

创建类的新实例:

$Utilities = new Utilitys(new db("mysql:host=XCensored;dbname=XCensored", "XCensored", "XCensored"));

使用对象

$a = $Utilities->db->run("SELECT * FROM XCensored WHERE XCensored =:id", array(':id' => (int)trim($XCensored)));

错误日志消息

PHP Notice:  Undefined variable: Utilities in XX/XX/XX/XX.php 
PHP Notice:  Trying to get property of non-object in XX/XX/XX/XX.php 
PHP Fatal error:  Call to a member function run() on a non-object in XX/XX/XX/XX.php 

看起来您正在交替使用"Utilities"answers"Utilitys"。。。除非这只是你问题中的一个拼写错误?

编辑:事实上,不,别理我。我读得不对。

编辑:你试过调试什么?我会在db和Utilitys类的不同位置放置一些var_dump()语句,试图缩小出错的地方。也许还可以在一个变量中实例化db类,并将该变量传递给"new Utilities()"。检查db变量是否首先包含一个db对象。如果是这样,那么您的问题就在Utilitys类中。

编辑:好的,如果你尝试过以下操作,对吗?:

$db=新数据库("mysql:host=XCensored;dbname=XCensered","XCensoreed","XCensored")
$utilities=新的utilities($db);

var_dump($db);//$db中是否真的有一个db对象
var_dump($utilities)//这里有什么

由原始帖子解决:"……我现在发现了,这是一个愚蠢的错误;这与变量范围有关,我必须使用PHP的全局命令才能使其工作"

Tocacar状态下,检查db类是否返回对象。您的代码似乎是正确的。

假设您在连接数据库时遇到问题。如果不起作用,您将不会收到对象。

顺便说一句,我发现你的db类非常令人困惑。公共$dbh变量使读取代码变得非常复杂。在db类中,您可以执行parent::execute()等

在db类之外,假设您有一个对象mDb,您可以执行$mDb->execute()

我花了很长时间试图理解你在做什么。这使得调试更加困难。

正如Tocacar正确提到的那样,避免使用像Utilities和Utilitys这样的小文件差异,这只是在以后问问题。