Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在一个类中混合使用静态和非静态方法是否可以接受?_Php_Class_Static Functions - Fatal编程技术网

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

Php 在一个类中混合使用静态和非静态方法是否可以接受?,php,class,static-functions,Php,Class,Static Functions,我有一个相对简单的问题,虽然在谷歌上有很多关于这个问题的帖子,但我找不到一个能简单回答这个问题的帖子 所以简短的问题是“在一个类中混合静态和非静态方法是否可以接受?”。我想我真的在问“坚持一种方法是好的做法”还是“在使用这两种方法时都要考虑”。 例如,如果我正在建立一个班级来处理冰箱里的食物,以下哪项(或其他)是最好的方法 例1: Class Food { public function __construct( $itemName, $itemDescription ) {

我有一个相对简单的问题,虽然在谷歌上有很多关于这个问题的帖子,但我找不到一个能简单回答这个问题的帖子

所以简短的问题是“在一个类中混合静态和非静态方法是否可以接受?”。我想我真的在问“坚持一种方法是好的做法”还是“在使用这两种方法时都要考虑”。 例如,如果我正在建立一个班级来处理冰箱里的食物,以下哪项(或其他)是最好的方法

例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();

提前感谢

Q:在一个类中混合使用静态和非静态方法可以接受吗

A:当然可以,只要:

1) 您确实觉得这两个方法在逻辑上属于同一个类,并且

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

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

这里有一个很好的讨论:


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

$food = new Food( "apple", "Nice juicy Pink Lady apple" );
Food::getAllFood(); //static
除非课堂上有硬编码的食物,否则不会有任何食物被退回。在构造函数中输入的内容,在
$food
中输入实例。但是您正在调用类本身来检索。那没有道理

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

$db = new JDE_DBClass($connectionString);
$rows = $db->doSelectQuery("select * from whatever");
$date = JDE_DBClass::convertJDE_Date_to_PHP_Date($rows[0]['dateField']);
在这种情况下,您可能希望这样做以允许在不必实例化db对象的情况下进行转换,因为在确定是否需要连接到db之前,您可能需要在JDE所谓的Julian格式和常规日期之间来回转换:

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

也不我会有一个
冰箱
,里面装着
食物
(也许还有
饮料
等等)@developerwjk。如果示例1中的静态函数具有从数据库检索食物项目的代码,该怎么办。这是一个与我实际尝试实现的类似的示例。在这种情况下,我认为应该将方法命名为
getAllFoodFromDB()
,以避免与类实例中的
getAllFood()
混淆。PS:“getAllFood()”永远不应该是“静态的”,因为它总是引用冰箱的特定实例。另一种方法是让getAllFood保持静止。。。然后将“冰箱”实例作为参数传递。但最好是让它成为一个非静态的方法。