【问题标题】:Is it acceptable to mix static and non static methods in one class?在一个类中混合静态和非静态方法是否可以接受?
【发布时间】:2014-11-04 23:23:40
【问题描述】:

我有一个相对简单的问题,虽然 Google 上有很多关于它的帖子,但我找不到一个可以简单回答问题的帖子。

所以简短的问题是“在一个类中混合静态和非静态方法是否可以接受?”。我想我真的是在问“坚持使用一种方法是一种好习惯”,还是“同时使用这两种方法时有什么要考虑的事情”。

例如,如果我正在创建一个类来处理冰箱里的食物,那么以下哪个(或其他)是最好的方法

示例 1:

Class Food
{
    public function __construct( $itemName, $itemDescription )
    {
        .... some code for a new item of food ....
    }

    public static function getAllFood()
    {
        .... some code to get all the items in my fridge ....
    }
}

$food = new Food( "apple", "Nice juicy Pink Lady apple" );
Food::getAllFood();

或示例 2:

Class Food
{
    public function __construct( $itemName, $itemDescription )
    {
        .... some code for a new item of food ....
    }

    public function getAllFood()
    {
        .... some code to get all the items in my fridge ....
    }
}

$food = new Food( "apple", "Nice juicy Pink Lady apple" );
$food->getAllFood();

提前致谢

【问题讨论】:

  • 两者都不是。我会有一个Fridge,其中包含Food 的集合(也许还有Drink 等)
  • @developerwjk。如果示例 1 中的静态函数具有从数据库中检索食物项目的代码会怎样。这与我实际想要实现的目标类似。
  • 在这种情况下,我认为您应该将方法命名为 getAllFoodFromDB() 以避免与类实例中的 getAllFood() 混淆。
  • PS:“getAllFood()”永远不应该是“静态的”,因为它总是引用冰箱的特定实例。另一种方法是使 getAllFood 静态...然后将您的“冰箱”实例作为参数传递。但最好将其设为非静态方法。

标签: php class static-functions


【解决方案1】:

问:在一个类中混合使用静态和非静态方法是否可以接受?

A:当然,只要:

1) 你真的觉得这两种方法在逻辑上属于同一个类,并且

2) 可以/应该独立于任何类实例调用静态方法。

最好的经验法则是在调用真正无状态时使用静态方法。

这是一个很好的讨论:

【讨论】:

    【解决方案2】:

    在这种情况下,您必须使用示例 2,因为您在示例 1 中尝试执行的操作将不起作用:

    $food = new Food( "apple", "Nice juicy Pink Lady apple" );
    Food::getAllFood(); //static
    

    除非课堂上有硬编码,否则不会退回任何食物。您在构造函数中放入的内容,您放入$food 中的实例中。但是你调用类本身Food::getAllFood() 来检索。这没有意义。

    是否存在在类中包含静态方法有意义的情况?是的。就像我正在创建一个将保持连接的数据库连接类一样,但我还想公开一些与特定 DBMS 相关但实际上并不需要与数据库的连接处于活动状态的日期格式方法。任何接触数据库的东西都必须是非静态的,但是我已经提取的数据的一些转换方法可能是静态的:

    $db = new JDE_DBClass($connectionString);
    $rows = $db->doSelectQuery("select * from whatever");
    $date = JDE_DBClass::convertJDE_Date_to_PHP_Date($rows[0]['dateField']);
    

    在这种情况下,您可能希望这样做以允许转换而不必实例化 db 对象,因为您可能需要在 JDE 的所谓 Julian 格式和常规日期之间来回转换,然后才能确定是否需要连接到数据库:

    $date = JDE_DBClass::convertJDE_Date_to_PHP_Date('114309');
    

    【讨论】:

      猜你喜欢
      • 2012-07-05
      • 1970-01-01
      • 2016-06-26
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 2020-08-06
      • 2011-07-11
      相关资源
      最近更新 更多