Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 具有超对象的可变范围问题_Php - Fatal编程技术网

Php 具有超对象的可变范围问题

Php 具有超对象的可变范围问题,php,Php,我在为正在进行的框架项目创建“超级对象”(类似于CodeIgniter)时遇到了一些问题 我想创建一个超级对象,我的所有其他类都将运行它。我这样做了,但似乎我无法在每个类中使用超级对象的对象,而不在每个函数中使用global关键字 我有这样的想法: class a { function aa() { return 'class a'; } } class b { function bb() { $blah->a-&g

我在为正在进行的框架项目创建“超级对象”(类似于CodeIgniter)时遇到了一些问题

我想创建一个超级对象,我的所有其他类都将运行它。我这样做了,但似乎我无法在每个类中使用超级对象的对象,而不在每个函数中使用global关键字

我有这样的想法:

class a
{
    function aa()
    {
        return 'class a';
    }
}

class b
{
    function bb()
    {
        $blah->a->aa();
    }
}

class superobj
{
    function loadClass($class)
    {
        $this->$class = new $class;
    }
}

class blah extends superobj
{
    function __construct()
    {
        $this->loadClass('a');
        $this->loadClass('b');
    }
}

$blah = new $blah;
所以如果我运行这个,我会得到一个错误,因为我无法访问aa方法。如果我把global$blah放到方法bb中,那么它就工作了(或者至少在我的实际项目中是这样的,我不知道这个5秒的模型是什么,呵呵)

那么,有没有办法使$blah对象成为全局对象,这样我就不需要在每个方法中引用它,或者有没有更好的方法来实现我要做的事情

我不太擅长OOP

function bb() {
    $blah->a->aa();
}
事实上,与任何函数一样,此函数的作用域中没有变量
$blah
既没有传递给函数,也没有在函数中定义,因此它不存在

如果对象依赖于
blah
的实例来工作,则应将其传递给构造函数

class b {

    var $blah = null;

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

    function bb() {
        $this->blah->foo();
    }
}

$b = new b($instanceOfBlah);
或者,使用一个静态类来保存对全局对象的引用,并在请求时返回它们(注册表模式,如
$blah=Registry::get('blah')

不要使用
global
。别这样

事实上,与任何函数一样,此函数的作用域中没有变量
$blah
既没有传递给函数,也没有在函数中定义,因此它不存在

如果对象依赖于
blah
的实例来工作,则应将其传递给构造函数

class b {

    var $blah = null;

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

    function bb() {
        $this->blah->foo();
    }
}

$b = new b($instanceOfBlah);
或者,使用一个静态类来保存对全局对象的引用,并在请求时返回它们(注册表模式,如
$blah=Registry::get('blah')


不要使用
global
。不要这样做。

可能重复:可能重复:我有没有办法对blah的构造函数执行此操作,以便每个扩展blah的类都能自动使用其方法?@Scott如果一个类扩展blah,它当然能够像使用自己的方法一样使用blah的方法。我将尝试解释这一点,并与我一起进行说明。如果我通过“superobj”加载“class b”,就像我在上面的例子中所做的那样,我不能使用“class a”的方法。如果我在superobj之外加载“class b”,那么它就可以工作了。但是,我需要它能够通过superobj加载,所以我只需要为我的所有库使用一个对象。编辑:请注意,在我上面的示例中,我并没有扩展blah,但在我的实际项目中,我是,例如调用$this->a->aa是不起作用的。@Scott抱歉,我不确定您的目标是什么。你可能误解了OO的工作原理。您还讨论了两件不同的事情:扩展对象和访问其他对象的方法,以及如何传递这些对象。也许你可以提供一个更具体的例子来说明你想要实现什么,使用比“a”和“blah”更有用的名称?好的,基本上,我正在尝试绕过PHP中缺乏多重继承的问题。我想创建一个所有其他类都可以运行的“master”类,这样我就有了一个可以访问所有方法的简单对象。我基本上想要CodeIgniter框架所做的。我想也许我必须花时间去挖掘CodeIgniter核心,看看到底发生了什么。我有没有办法对blah的构造函数这样做,这样每个扩展blah的类都能自动使用它的方法?@Scott如果一个类扩展blah,当然,它可以像自己一样使用布拉的方法。我会尽量解释这一点,和我一起。如果我通过“superobj”加载“class b”,就像我在上面的例子中所做的那样,我不能使用“class a”的方法。如果我在superobj之外加载“class b”,那么它就可以工作了。但是,我需要它能够通过superobj加载,所以我只需要为我的所有库使用一个对象。编辑:请注意,在我上面的示例中,我并没有扩展blah,但在我的实际项目中,我是,例如调用$this->a->aa是不起作用的。@Scott抱歉,我不确定您的目标是什么。你可能误解了OO的工作原理。您还讨论了两件不同的事情:扩展对象和访问其他对象的方法,以及如何传递这些对象。也许你可以提供一个更具体的例子来说明你想要实现什么,使用比“a”和“blah”更有用的名称?好的,基本上,我正在尝试绕过PHP中缺乏多重继承的问题。我想创建一个所有其他类都可以运行的“master”类,这样我就有了一个可以访问所有方法的简单对象。我基本上想要CodeIgniter框架所做的。我想也许我必须花时间去挖掘CodeIgniter核心,看看到底发生了什么。