使用对象操作静态属性和静态方法的问题

<?php
declare(strict_types=1);
ini_set('display_errors', 'On');
error_reporting(-1);

/**
 * Human类
 */
class Human
{
    private static string $name = 'anonymous';
    private static string $gender = 'n/a';
    private static int $age = 0;

    public function __construct(string $name, string $gender, int $age)
    {
        self::$name = $name;
        self::$gender = $gender;
        self::$age = $age;
    }

    public static function profile(): void
    {
        $name = self::$name;
        $gender = self::$gender;
        $age = self::$age;

        echo "俺叫{$name}{$gender}),今年{$age}岁。" . PHP_EOL;
    }
}

Human::profile(); // 俺叫anonymous(n/a),今年0岁。

$human1 = new Human('张三', '男', 18);

$human1->profile(); // 俺叫张三(男),今年18岁。
Human::profile(); // 俺叫张三(男),今年18岁。

$human2 = new Human('李四', '女', 17);

$human1->profile(); // 俺叫李四(女),今年17岁。
$human2->profile(); // 俺叫李四(女),今年17岁。
Human::profile(); // 俺叫李四(女),今年17岁。


//========== 总结 ==========//
// 1、对象也是可以使用静态属性和调用静态方法的,但这不是一个良好的编程方式,对于静态属性和静态方法,应该尽可能使用类名来操作,
//    而不是使用对象来操作,因为这样可以更清晰地表达代码含义。
// 2、由不需要创建对象就可以使用静态属性和调用静态方法可知,静态属性和静态方法是属于类的,或者说静态属性和静态方法是所有对象共有的,
//    无论创建了多少个对象,静态属性始终只有一个,这些对象操作静态属性实际上是在操作同一个变量。

Copyright © 2024 码农人生. All Rights Reserved