【问题标题】:OOP - Handling Automated Instances of a Class - PHPOOP - 处理类的自动化实例 - PHP
【发布时间】:2010-03-26 11:52:36
【问题描述】:

对于 PHP 和编程的初学者来说,这是一个让我感到困惑的话题。我正在建立一个股票市场网站,并希望用户添加自己的股票。我可以清楚地看到让每只股票成为具有类的所有方法的类实例的好处。我被难倒的是当我实例化它时给它起一个名字的最好方法。如果我有:

class Stock() {
   ....doing stuff.....

}

为我的实例命名的最佳方式是什么。显然我可以写:

$newStock = new Stock();
$newStock.getPrice();

或其他,但如果用户通过应用添加股票,该实例的名称从何而来?我想总是用 $newStock = new Stock() 创建一个新孩子然后将其存储到数据库中并没有什么坏处,这让我想到了下一个问题!

将 20 个用户股票(例如)检索到 Stock() 类的实例中的最佳方法是什么?每次用户登录时,我是否需要实例化 20 个新的类 Stock() 实例,或者我缺少什么?

我希望有人回答这个问题,更重要的是希望一群人回答这个问题,它会以某种方式帮助那些难以理解可能导致真正优雅解决方案的人。多谢你们!

【问题讨论】:

  • 作为附录,一位朋友向我提到了另一种选择,那就是另开一个班级,将股票作为一个整体持有。该类将每个单独的 Stocks 实例保存在一个数组中,并致力于将对象作为一个组进行管理,以在项目变大时保持对项目的控制。

标签: php oop class instantiation


【解决方案1】:

我建议这样做:

class Stock()
{
   public var $symbol;

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

   public function lookup()
   {
       // do something
       return $data;
   }
}


$stock = new Stock('AAPL');
$data[] = $stock->lookup();

所以你可以先$stock->symbol = 'NEWSYMBOL'; 然后$stock->lookup();

【讨论】:

  • 我理解实例化股票的想法。对我来说,问题在于如果用户添加 3 只新股票,它们都会被变量 $stock 实例化。那,或者一旦它们被创建,它们就会被放入数据库中,然后在检索它们时,我不需要将它们检索到实例中,而只需将它们检索到表或数组中。我的难题是,使用这种方法一次只能有一个实例,因为唯一的变量名是 $stock。那有意义吗?感谢您的回复。
  • dscher,我想我很难理解你在说什么,但 $stock 是 Stock 类的一个实例,尽管它可以用于不同的股票代码。
  • Jud,感谢您的回复。假设我有 30 只股票要在页面上加载到表格中,我是否应该在循环中一遍又一遍地使用 $stock 来加载每只股票并显示它?或者我不会使用 Stock 类,而是只查询数据库并将数据放入表中,然后仅在有人请求特定股票时实例化?非常感谢您的回答。
  • 最后都是一样的。一个类可以包含数据库逻辑,它只是全部模块化以供重用。
  • 我明白这一点。正如下面另一个答案中提到的那样,将 Stock 的实例创建为数组并使用股票行情来表示个股呢?在您看来,这会是一个更优雅、更实用的解决方案吗?感谢您的意见!
【解决方案2】:

您可以只使用一组股票。注意 [] 表示向数组中添加一个新项。

$stocks[] = new Stock();

您可以像这样遍历所有这些:

foreach ($stocks as $stock) {
    echo $stock->lookup();
}

您可以像这样访问特定股票:

$stocks[7]->display();

【讨论】:

  • 所以我可以将一个新对象实例化为一个数组,例如: $stocks['AAPL'] = new Stock();那是对的吗?因此,特定用户的所有股票都可以保存在 $stocks 的一个实例中,它只是一个数组?如果是这样,我认为您以一种我没想到但非常喜欢的方式回答了我的问题。谢谢!
【解决方案3】:

我不明白您为什么不只创建一个 Stock() 对象并让它从数据库中加载各种股票属性。这似乎是一种更安全的方式,对我来说也不那么复杂。

【讨论】:

  • 如果我了解这样做的方法,我会这样做。这是否意味着当用户登录时,他们所有的股票都会被实例化为新对象?这些新实例是如何命名的?还是仅在有人选择编辑它们并且需要基于 Stock 的方法时才实例化它们?
  • 您可以设置各种属性,例如您可以编写如下函数: function findStock($symbol){ $db->get_row("SELECT * FROM stock WHERE stock_symbol = '" .mysql_real_escape_string ($symbol) . "'");等等..... } 并在设置详细信息的函数中使用结果: function setStock($mySqlResults){ $this->name = $mySqlResults['stock_name']; $this->symbol = $mySqlResults['stock_symbol']; ------- 或者我完全误解了这个问题?
猜你喜欢
  • 2015-08-26
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多