目錄
对象克隆
类继承
继承和构造函数
继承与延迟静态绑定
接口和抽象类
什么时候用接口,什么时候用抽象类
命名空间
首頁 後端開發 php教程 第三章(高级oop)-《php和mysql web开发》《php与mysql程序设计》齐读

第三章(高级oop)-《php和mysql web开发》《php与mysql程序设计》齐读

Jun 20, 2016 pm 12:37 PM

对象克隆

对象在默认情况下都是按引用传递的,如果需要复制一个对象,将对象的值进行一个完整的cp,需要使用clone方法

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
登入後複製

上面是克隆一整个对象的,可以用__clone方法来调整对象克隆的行为,此方法只克隆操作期间执行

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!
登入後複製

继承和构造函数

如果父类有构造函数,而且子类没有构造函数,那么在子类实例化得时候是会执行父类的构造函数的,如果父类和子类同时都有构造函数的话,那么当子类实例化的时候,只会执行子类的构造函数,除非使用

parent显式调用父类构造函数,又或者直接调用父类的构造函数 classname::__construct()

继承与延迟静态绑定

有一种情况,一个父方法要与静态类属性交互,但这些静态类属性可能在子类被覆盖,那么怎么定义static静态类的作用域呢,之前一直也没有说这个情况,因为静态类定义本身就是仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。

这种情况在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的类,他是用于描述各种公开出版的共同性质,因为media不表示真实的实体,而是一些相似实体的泛化表示,所以不实例化,这样就需要声明为抽象类,然后再由各种的派生的Media类继承此抽象类

什么时候用接口,什么时候用抽象类

  • 如果要创建一个模型,这个模型将由一些紧密相关的对象引用,就可以采用抽象类,如果要创建将由一些不想关的对象采用的功能,应该用接口。
  • 如果必须从多个来源继承行为,就是用接口。
  • 如果知道所有类都会共享一个公共的行为实现,就使用抽象类,并在其中实现行为。接口无法实现。

命名空间

什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。

< ?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?>
登入後複製

本文由 PeterYuan 创作,采用 署名-非商业性使用 2.5 中国大陆 进行许可。 转载、引用前需联系作者,并署名作者且注明文章出处。神一样的少年 » 第三章(高级oop)-《php和mysql web开发》《php与mysql程序设计》齐读

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

描述紮實的原則及其如何應用於PHP的開發。 描述紮實的原則及其如何應用於PHP的開發。 Apr 03, 2025 am 12:04 AM

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

如何在系統重啟後自動設置unixsocket的權限? 如何在系統重啟後自動設置unixsocket的權限? Mar 31, 2025 pm 11:54 PM

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

解釋PHP中晚期靜態結合的概念。 解釋PHP中晚期靜態結合的概念。 Mar 21, 2025 pm 01:33 PM

文章討論了PHP 5.3中介紹的PHP中的晚期靜態結合(LSB),允許靜態方法的運行時間分辨率調用以更靈活的繼承。 LSB的實用應用和潛在的觸摸

如何用PHP的cURL庫發送包含JSON數據的POST請求? 如何用PHP的cURL庫發送包含JSON數據的POST請求? Apr 01, 2025 pm 03:12 PM

使用PHP的cURL庫發送JSON數據在PHP開發中,經常需要與外部API進行交互,其中一種常見的方式是使用cURL庫發送POST�...

框架安全功能:防止漏洞。 框架安全功能:防止漏洞。 Mar 28, 2025 pm 05:11 PM

文章討論了框架中的基本安全功能,以防止漏洞,包括輸入驗證,身份驗證和常規更新。

自定義/擴展框架:如何添加自定義功能。 自定義/擴展框架:如何添加自定義功能。 Mar 28, 2025 pm 05:12 PM

本文討論了將自定義功能添加到框架上,專注於理解體系結構,識別擴展點以及集成和調試的最佳實踐。

See all articles