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

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

WBOY
WBOYOriginal
2016-06-20 12:37:39862Durchsuche

对象克隆

对象在默认情况下都是按引用传递的,如果需要复制一个对象,将对象的值进行一个完整的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程序设计》齐读

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:array小问题Nächster Artikel:php7 + nginx + mysql 安装小计