色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

php trait this

許迪宇1年前7瀏覽0評論
在PHP編程中,Trait是一個令人興奮的新功能。它可以提供代碼重用和組合而不用繼承的靈活性。而$this則是Trait的一個核心細節(jié),非常重要。
$this關鍵字引用的當前實例,而Trait可以被多個類使用。因此,$this可以在Trait中引用多個類的實例。下面我們來看一個例子。
php
trait myTrait {
public function sayHello() {
echo "Hello, my name is " . $this->name . "<br>";
}
}
class Person {
public $name;
use myTrait;
public function __construct($name) {
$this->name = $name;
}
}
class Child {
public $name;
use myTrait;
public function __construct($name) {
$this->name = $name;
}
}
$p = new Person("Tom");
$c = new Child("Jerry");
$p->sayHello(); // 輸出 Hello, my name is Tom
$c->sayHello(); // 輸出 Hello, my name is Jerry

在上面的代碼中,我們定義了一個myTrait Trait,它有一個sayHello()方法,打印輸出的是當前實例的名字。Person和Child兩個類都使用myTrait Trait,并在構造函數(shù)中分別初始化了類的$name屬性。接著,我們創(chuàng)建了一個$p對象和一個$c對象,并調用sayHello()方法。由于Trait中引用了$this,所以方法中的$this指向調用該方法的對象。
下面再來看一個更復雜的例子:
php
trait myTrait {
protected $name;
public function setName($name) {
$this->name = $name;
}
}
class ParentClass {
use myTrait {
myTrait::setName insteadof ClassB;
}
}
class ClassA extends ParentClass {
public function sayHello() {
echo "Hello, my name is " . $this->name . "<br>";
}
}
class ClassB extends ParentClass {
public function sayHello() {
echo "Hi, I am " . $this->name . "<br>";
}
}
$objA = new ClassA;
$objA->setName("Tom");
$objA->sayHello(); //輸出 Hello, my name is Tom
$objB = new ClassB;
$objB->setName("Jerry");
$objB->sayHello(); //輸出 Hi, I am Jerry

在這個例子中,ParentClass使用了myTrait,并重命名了myTrait的setName方法,防止和ClassB重名造成沖突。ClassA和ClassB都繼承自ParentClass,ClassA和ClassB中都定義了一個sayHello()方法。這兩個sayHello()方法的行為各有不同,分別輸出當前實例名字的不同格式。
在實例化時,$objA和$objB都分別調用了setName()方法,并調用了sayHello()方法。由于Trait中$this指向調用該方法的對象,前者輸出結果中sayHello()方法中的$this指向$objA,后者輸出結果中的sayHello()方法中的$this指向$objB。
以上兩個例子說明了$this在Trait中的重要性,可以讓Trait在多個類中獲得實例引用。同時,我們也可以看到了Trait和$this的強大組合,能夠極大地提高我們的編程效率。