【问题标题】:OOP - Classes and Subclasses - Call subclass method [closed]OOP - 类和子类 - 调用子类方法 [关闭]
【发布时间】:2013-04-25 17:44:05
【问题描述】:

我想知道这个语法是否正确:

在 Classes.php 上:

Class Cart {

   public $Product; // an object handler will be set on this property

   public function __construct($user) {
   // get a product on user's cart (let's say it's only 1 product) - returns $id
   $this->Product = new Product($id);
   }
}


Class Product {

   public function __construct($id) {
   // construct goes here
   }

   public function Product_Method() {
   // product method goes here
   }

}

关于脚本

$cart = new Cart($user);
$product_method = $cart->Product->Product_method();

在我看来没问题,因为 $product 设置为 Public 并且引用了一个对象处理程序。

【问题讨论】:

  • 什么是 Product_method() 我在定义中没有看到
  • 有什么问题?
  • 这不是我所说的子类,更多的是在属性上调用方法,但只要$cart->Product 不是unset() 就可以了。
  • 你试过了吗? @LucasTourinhoCavalcante
  • 是的。没有为我工作。但我希望这是一些代码错误,而不是不正确的语法。

标签: php class


【解决方案1】:

这里的“正确”有多种含义。

  1. 语法

    你的语法是正确的。您可以通过运行代码轻松发现这一点,所以我不确定这是否是您要问的问题。

  2. 正确性

    正如其他人所说,$id 不存在于构造函数的范围内。这将导致运行时错误。

  3. 最佳做法

    Dependency injection 这些天风靡一时。不鼓励从构造函数调用 new。相反,您将传入您的 Product 对象。请注意,这有点主观,如果这听起来不必要地复杂,则没有强迫您这样做,但至少要知道人们反对它的原因,以便您做出明智的决定。

    另外,根据您的用例,封装功能可能会更好,这样外部代码就不必知道Product 的方法(它只需要处理购物车)。也就是说,将$Product设为私有,并在Cart中添加一个方法,该方法负责调用Product_method()。这可能有意义,也可能没有意义,具体取决于Product_method() 的语义(Cart 应该知道怎么做吗?)。

【讨论】:

  • 也只是一个术语挑剔:Product 不是“子类”。该术语严格指inheritance。你正在做的是composition
  • 亲爱的马特,感谢您的详细回复。它完全解决了我的疑问,但也让我思考了问题的另一个方面。关于依赖注入,我能否请您澄清这段话:“相反,您将传入您的 Product 对象”。我没有抓住建议的“出路”。
  • 自从我写这篇文章以来,看着你的新 cmets 和编辑,你确实在问语法。 If you're getting errors 知道它们是什么会很有帮助;也许您应该发布一个新的、更具体的问题。
  • @LucasTourinhoCavalcante:真的很简单,只是用了一些听起来很复杂的术语。调用代码会这样做:$product = new Product(); $cart = new Cart($user, $product);。 Cart 的构造函数会将$this->Product 设置为传入的对象。如果你走这条路,我还推荐type hint
  • 哦,我现在明白了。问题是,当我构建购物车时,我不知道里面可能有哪些产品。然而,我需要为每个 Product 调用确定的 Product 方法,这样我就可以访问价格、佣金、尺寸并计算 total 。在目前的情况下,购物车实际上是由几个产品的对象组成的,所以我相信依赖注入不会那么糟糕。再次感谢马特,非常感谢您的帮助。最好的问候,卢卡斯
【解决方案2】:

您通过将 $id 传递给 new Product($id) 在构造函数中使用它,但是您从哪里获得 $id?而且你只是在函数中浮动了一个字符串,没有回显或分配给变量。

【讨论】:

  • 我没有放整个类,因为怀疑与这个的有效性有关:$class->property->method()。作为在 __construct 上创建的对象处理程序的属性
【解决方案3】:

$id 是什么?您需要在构造中设置 $id

Class Cart {

   public $Product;

   public function __construct($user,$id) {
   "get a product on user's cart (let's say it's only 1 product)"
   $this->Product = new Product($id);
   }
}

在你的代码中

$cart = new Cart($user,$id);
$product_method = $cart->Product->Product_method();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 2019-01-05
    • 2017-11-09
    • 2011-10-24
    相关资源
    最近更新 更多