【问题标题】:php global causing non-object error unless transfered from $GLOBALSphp 全局导致非对象错误,除非从 $GLOBALS 转移
【发布时间】:2015-10-29 13:03:42
【问题描述】:

我有一个包含类的文件。当我需要访问课程时,我会include 这个文件。我想在类所在的文件中声明类,这样我只需要声明一次类,只需要include文件就可以使用类。

这行得通。

<?php

$GLOBALS['foo_model'] = new foo_model;
$foo_model = $GLOBALS['foo_model'];
global $foo_model;

Class foo_model
{
    function foo_function() {
        // ect
    }
}

这不起作用

<?php

$foo_model = new foo_model;
global $foo_model;

Class foo_model
{
    function foo_function() {
        // ect
    }
}

尝试使用该类时会导致错误。

Call to a member function foo_function() on a non-object

为什么一定要以$GLOBALS开头,然后转成正则变量再套用global。我认为$GLOBALSglobal 只是语法不同。 $GLOBALS 在这里有什么不同?

此外,编写包含类的文件的最佳方法是什么,以便我可以include该文件,并使用该类,而无需在包含该文件后声明该类,也无需使用@987654332 @?我的第一个代码 sn-p 是完成此任务的最佳方式吗?

【问题讨论】:

  • 我将从类定义开始,然后是实例化。
  • 如果你的意思是把$api_model = new api_model; global $api_model;放在文件的底部,那仍然会弹出一个非对象错误。

标签: php scope include global-variables


【解决方案1】:

不要这样做,这是非常糟糕的设计。尝试使用 Traits。

但我看到你正在尝试做的是创建类文件并加载它而不包含它。这就是自动加载器类的概念。 看看这个:http://php.net/manual/en/function.autoload.php

记住:全局变量总是有问题的,尽可能避免它们。

【讨论】:

  • 我以前没有听说过 Traits。我会研究 Traits 并考虑自动加载是否适合我的情况,然后会回复您。
  • 事实证明,就我的情况而言,我需要将我的代码从过程性更改为面向对象,以使这些全局问题消失。但是,您的回答对于得出这个结论非常宝贵。我仍然想了解为什么 GLOBALS 在这种情况下的行为与 global 不同。
  • 对不起,如果我不能帮助你更多,但根据我的理解并在手册中说明,自动加载正是你所需要的——它的设计方式是创建类而不包含它们的文件。至于为什么,全局关键字已弃用,您的 PHP 版本是多少?此外,php.net/manual/en/reserved.variables.globals.php $_GLOBALS 是使用全局范围的正确方法。另请注意,从 PHP 5.3.0 开始,如果您像以前一样在函数中使用它,则需要使用 global 关键字声明变量。当然,更改为 OO 会消失,因为当使用 OO 时,您的所有内容都在同一个范围内
  • 还有一件事,当我阅读手册时,我认为有一条注释可以解释您想知道的内容:“注意:在函数之外使用全局关键字不是错误。它如果文件包含在函数内部,则可以使用。“因此,如果我了解您在做什么,那正是发生在您身上的事情...
  • 也许吧。我可以重构一些东西让它工作,但如果我要花那么多时间,还不如去 OO,这是我更喜欢的。
猜你喜欢
  • 2012-05-29
  • 2011-04-04
  • 2011-02-07
  • 1970-01-01
  • 2011-01-25
  • 2015-02-12
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多