【问题标题】:Alternative to regular PHP Class替代常规 PHP 类
【发布时间】:2011-06-02 14:14:49
【问题描述】:

通常在创建 PHP 类时,我会这样做

class Foo
{
    public function Foo(){}
    public function RandomFunction(){};
}
global $foo;
$foo = new Foo();
$foo->RandomFunction();

我注意到在网络上人们对类的全局变量不满意,但没有它我将无法在其他函数中访问该类。

现在的替代方法是使用静态类:

class Foo
{
    static public function RandomFunction(){}
}
Foo::RandomFunction();

我的问题是,这是类全局变量的最佳替代方案吗?或者有没有更好的方法来一起解决这一切?

【问题讨论】:

  • 我不太确定你的目标是什么。为什么$foo 在您的示例中需要是全局的?如果要在其他函数中访问该实例,则应将其作为参数传递。我感觉您正在使用类作为(任意)函数的容器......
  • 如果您使用的是 PHP5,请开始使用__construct
  • 例如,wordpress 在其函数中使用全局 $foo,因此可以从其他函数或类访问 $foo 类。将其作为参数传递听起来是个坏主意。

标签: php object static


【解决方案1】:

在良好的 OO 实践中,如果一个类需要访问另一个类的实例,您可以将对象作为参数传入,然后从那里访问它的属性和方法。

如果您有一个设计良好的对象模型,那么代码应该相对干净和合乎逻辑,但是如果您不打算创建一个严格的 OO 应用程序,您可能不应该担心您的类是否在全局范围内。

【讨论】:

  • 你真的会把它作为参数传递吗?这样做似乎效率不高。但话又说回来,我对此比较陌生。
  • 是的,当然。如果一个类需要另一个类的实例,则它发送对象作为参数的发送量与任何其他数据类型一样多。如果你有一个 Person() 类,你可以传递它(“食物”、“冰淇淋”、“200 卡路里”)或包含所有这些信息和相关方法的食物对象。阅读一些设计模式应该可以解决这个问题。
  • 尽量不要对隐喻读得太深。只需将类视为普通数据类型,例如 int 或字符串,您可以使用一些额外的花里胡哨。不过,这是个好问题,祝你在未来的学习中好运。 +1
【解决方案2】:

把你的物体想象成一辆自行车。您拥有自己的自行车,并且可以将其借给您想要的任何人。他们可以使用它并将其归还给您,您将能够跟踪谁对您的自行车做了什么,以及何时。

但是,如果您的自行车普遍可供世界上任何人使用,那么您监控和控制对它的访问的工作将变得更加困难。您将很难跟踪谁在使用您的自行车、他们何时使用以及他们如何(ab)使用它。

传递您的对象(而不是全局声明它们)允许您对您的对象及其包含的数据进行更严格的控制。

【讨论】:

  • & $classname中作为参考传递?
  • 最近的 PHP 版本自动通过引用函数来传递对象,所以你不需要使用 '&'。
  • 所以本质上我可以做 $foo->RandomFunction($object, $otherparam)。有道理。
猜你喜欢
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多