オブジェクトをコピーし、オブジェクトの値の完全な cp を実行する必要がある場合は、クローン メソッド
class Corporate_Drone{ private $employeeid; private $tiecolor; function setEmployeeID($employeeid) { $this->employeeid = $employeeid; } function getEmployeeID() { return $this->employeeid; } function setTieColor($tiecolor) { $this->tiecolor = $tiecolor; } function getTieColor(){ return $this->tiecolor; }}$drone1 = new Corporate_Drone();$drone1->setEmployeeID("12345");$drone1->setTieColor("red");$drone2 = clone $drone1; //这里克隆实例$drone1,因为$drone1已经set过属性了,所以clone得时候一并复制了,$drone2->setEmployeeID("67890"); //然后这里克隆后的$drone2 set自己的属性echo "Drone1 employeeID is ".$drone1->getEmployeeID()."\n";echo "Drone1 tie color is ".$drone1->getTieColor()."\n";echo "Drone2 employeeid is ".$drone2->getEmployeeID()."\n";echo "Drone2 tie color is ".$drone2->getTieColor()."\n";----Drone1 employeeID is 12345Drone1 tie color is red Drone2 employeeid is 67890 //这里被修改了,但是下面的color依然是实例$drone1的属性值Drone2 tie color is red
上記は、オブジェクト全体のクローンを作成するためのものです。このメソッドは、クローン作成操作中にのみ実行されます。
class Corporate_Drone{ private $employeeid; private $tiecolor; function setEmployeeID($employeeid) { $this->employeeid = $employeeid; } function getEmployeeID() { return $this->employeeid; } function setTieColor($tiecolor) { $this->tiecolor = $tiecolor; } function getTieColor(){ return $this->tiecolor; } function __clone() { $this->tiecolor = "blue"; //这里是指这个__clone方法会在克隆期间修改颜色tiecolor }}$drone1 = new Corporate_Drone();$drone1->setEmployeeID("12345");$drone1->setTieColor("red");$drone2 = clone $drone1; //这里克隆实例$drone1,因为$drone1已经set过属性了,所以clone得时候一并复制了,$drone2->setEmployeeID("67890"); //然后这里克隆后的$drone2 set自己的属性echo "Drone1 employeeID is ".$drone1->getEmployeeID()."\n";echo "Drone1 tie color is ".$drone1->getTieColor()."\n";echo "Drone2 employeeid is ".$drone2->getEmployeeID()."\n";echo "Drone2 tie color is ".$drone2->getTieColor()."\n";----Drone1 employeeID is 12345Drone1 tie color is redDrone2 employeeid is 67890Drone2 tie color is blue //看这里结果,颜色被改变了。
class Employee{ private $name; function setName($name) { if ($name == "") echo "Name connot be blank!"; else $this->name = $name; } function getName() { return "My name is ".$this->name."\n"; }}class Executive extends Employee{ //这里用extends继承,Executive 继承了Employee的类的所有属性和方法 function pillageCompany() { //这里Executive也有自己的方法 echo "Im selling company assets to finance my yacht!"; }}$exec = new Executive();$exec->setName("richard"); //因为继承了Employee父类,所以可以setnameecho $exec->getName()."\n"; //同上$exec->pillageCompany(); //也可以使用自己的方法----My name is richardIm selling company assets to finance my yacht!継承とコンストラクター
親クラスにコンストラクターがあり、子クラスにコンストラクターがない場合、子クラスがコンストラクターを持っているときに親クラスが実行されます。コンストラクターの場合、親クラスとサブクラスの両方にコンストラクターがある場合、サブクラスがインスタンス化されると、
親を使用して親クラスのコンストラクターを明示的に呼び出さない限り、サブクラスのコンストラクターのみが実行されます。関数を呼び出すか、親クラスのコンストラクターを直接呼び出します。 classname::__construct()
継承と遅延静的バインディング
この状況はphp5.3以降で解決されました。
class Employee{ public static $favSport = "Football"; //在class employee中的静态变量$favSport public static function watchTV() { echo "Watching ".self::$favSport; //这里调用了class employee的静态变量 }}class Executive extends Employee{ public static $favSport = "polo"; //在class Excutive的静态变量$favSport,由于Ex是继承了Em的,所以理当是能够覆盖变量的,但是因为执行的是静态方法watchTV,对此给出的解释是,self关键字会在编译的时候而非运行时确定其作用域,因此,结果是Football public static function watchTV() { //如果通过重写watchTV函数,重新定义使用的static的变量,就可以重新定义static的作用域,从而实现需要的覆盖效果 echo "Watching ".static::$favSport; }}echo Executive::watchTV();インターフェースと抽象クラス
抽象クラスは、インスタンス化できず、他のクラスによって継承された基本クラスとしてのみ使用できるクラスです。たとえば、メディアという名前のクラスは、さまざまな公開出版物の共通プロパティを記述するために使用されます。実際のエンティティを表すのではなく、いくつかの同様のエンティティの一般化された表現であるため、インスタンス化されず、抽象クラスとして宣言する必要があります。その後、さまざまな派生 Media クラスがこの抽象クラスを継承します。
インターフェイスの使用方法と抽象クラスの使用時期
< ?phpnamespace Foo\Bar;include 'file1.php';const FOO = 2;function foo() {}class foo{ static function staticmethod() {}}/* 非限定名称 */foo(); // 解析为 Foo\Bar\foo resolves to function Foo\Bar\foofoo::staticmethod(); // 解析为类 Foo\Bar\foo的静态方法staticmethod。resolves to class Foo\Bar\foo, method staticmethodecho FOO; // resolves to constant Foo\Bar\FOO/* 限定名称 */subnamespace\foo(); // 解析为函数 Foo\Bar\subnamespace\foosubnamespace\foo::staticmethod(); // 解析为类 Foo\Bar\subnamespace\foo, // 以及类的方法 staticmethodecho subnamespace\FOO; // 解析为常量 Foo\Bar\subnamespace\FOO/* 完全限定名称 */\Foo\Bar\foo(); // 解析为函数 Foo\Bar\foo\Foo\Bar\foo::staticmethod(); // 解析为类 Foo\Bar\foo, 以及类的方法 staticmethodecho \Foo\Bar\FOO; // 解析为常量 Foo\Bar\FOO?>この記事は Peter Yuan によって作成され、表示 - 非営利 2.5 中国本土に基づいてライセンスされています。 転載または引用する前に、著者に連絡し、著者名に署名し、記事の出典を示す必要があります。神のような少年 » 第 3 章 (上級編) - 「php と mysql の Web 開発」と「php と mysql のプログラミング」をまとめて読む