小熊奶糖(BearCandy)
小熊奶糖(BearCandy)
发布于 2024-03-16 / 11 阅读
0
0

php同个类实例化不同对象属性的独立性以及特殊情况static

在PHP中,当你实例化一个类得到两个不同的对象时,这两个对象的属性值通常是相互独立的,不会互相影响。也就是说,如果你改变其中一个对象的属性值,不会直接影响到另一个对象。

例如:

class Car {
    public $color;
  
    public function __construct($color) {
        $this->color = $color;
    }
}

// 实例化第一个对象
$car1 = new Car("red");
echo $car1->color; // 输出 "red"

// 实例化第二个对象
$car2 = new Car("blue");
echo $car2->color; // 输出 "blue"

// 改变第一个对象的属性值
$car1->color = "green";
echo $car1->color; // 输出 "green"

// 第二个对象的属性值不受影响
echo $car2->color; // 仍然输出 "blue"

在这个例子中,$car1$car2Car 类的两个不同实例,它们各自拥有独立的 $color 属性,修改 $car1 的颜色并不会改变 $car2 的颜色。

当然,如果类中的属性是静态(static)的,则情况不同,因为静态属性是所有对象共享的,对静态属性的修改会影响到所有对象对该属性的访问结果。

在PHP中,静态(static)属性和方法是与类相关联而不是与类的实例关联的。这意味着无论你创建了多少个类的实例,静态属性都只会有一个副本,并且所有的实例都会共享这一份副本。静态方法也可以在没有类实例的情况下直接通过类名调用。

以下是一个有关静态属性和方法的例子:

class MyClass {
    // 静态属性
    public static $sharedValue = 0;

    // 静态方法
    public static function incrementShared() {
        self::$sharedValue++;
    }

    // 普通方法(非静态方法)
    public function incrementInstanceValue($value) {
        $this->instanceValue = $value + 1;
    }

    // 实例属性
    public $instanceValue;
}

// 创建第一个对象
$obj1 = new MyClass();
MyClass::incrementShared(); // 静态方法调用,无需实例化对象
echo MyClass::$sharedValue; // 输出 1

// 创建第二个对象
$obj2 = new MyClass();
MyClass::incrementShared();
echo MyClass::$sharedValue; // 输出 2,因为这是共享的静态属性,已经增加了两次

// 修改第一个对象的实例属性
$obj1->incrementInstanceValue(10);
echo $obj1->instanceValue; // 输出 11

// 第二个对象的实例属性不受影响
echo $obj2->instanceValue; // 输出默认值,假设是 null 或者未初始化的值

// 证明静态属性是共享的
echo $obj1::$sharedValue; // 输出 2
echo $obj2::$sharedValue; // 输出 2,与 obj1 中的相同

在上述示例中,$sharedValue 是一个静态属性,每次调用 incrementShared 方法时,它的值都会增加,并且所有 MyClass 的实例都能看到这个增加后的值。而 instanceValue 是非静态属性,每个对象有自己的独立副本,互不影响。


评论