【问题标题】:PHP: Out of scope variable access [closed]PHP:超出范围的变量访问[关闭]
【发布时间】:2013-04-25 00:48:20
【问题描述】:

访问超出范围的变量的最佳方法是什么,请参阅我当前的方法:

// Define API
require_once( 'api.php' );
global $myapi;
$myapi = new LazyAPI( 'My API', 'myapi' );

class Content {

    function DoAction() {

        global $myapi;
        $key = $myapi->someFunc() . "-key";

    }

}

$content = $myapi->Content(); // LazyAPI is a class that loads classes in other files using reflection
$content->DoAction();

我面临的问题(并且在进一步测试之前无法测试)是在其他文件中重新声明或重用 $myapi。我只使用了global 访问修改器,因为我知道它有效,但我不知道是否有更好的选择。这个想法是能够声明多个$myapi 变量并且只能在主文件的范围内访问。

【问题讨论】:

  • 如果我错了,请纠正我。但是你不能只在顶部做require_once()并在函数DoAction()中实例化api吗?
  • $myapi 用于多个类。
  • 我认为您正在寻找单例模式。创建一个工厂类,在需要时返回 $myapi 的相同实例。
  • 变量不能总是一样的,但是名字总是要一样的。使其成为静态/等。行不通。

标签: php global-variables scope reusability redeclare


【解决方案1】:

使用depency injection

require_once( 'api.php' );

class Content {

    public function __construct($myapi) {
        $this->myapi = $myapi;
    }

    function DoAction() {
        $key = $this->myapi->someFunc() . "-key";
    }

}

$myapi = new LazyAPI('My API', 'myapi' );
$content = new Content($myapi);
$content->DoAction();

一些关于depency injection in PHP 的有用幻灯片。

【讨论】:

  • 变量$myapi 必须是变量,因为它在多个类中使用。我知道通过构造函数传递变量,但是没有更好的方法吗?
  • 我还应该指出一些使这个解决方案对我来说看起来“错误”的东西,请参阅原始帖子。
  • @BrianGraham,通过这种方式,您的课程变得可测试、可重用、灵活......是的,这是最好的方式。
  • 看看我实际上是如何声明一个新类的? $content = $myapi->Content();。这就是为什么$content = $myapi->Content($myapi); 看起来不对,我不想使用它。
  • @BrianGraham,你也可以使用 Factory。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
  • 2014-11-11
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 2011-10-21
  • 2011-08-20
相关资源
最近更新 更多