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