搜索
首页后端开发php教程第三章(高级oop)-《php和mysql web开发》《php与mysql程序设计》齐读

对象克隆

对象在默认情况下都是按引用传递的,如果需要复制一个对象,将对象的值进行一个完整的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
在Laravel中使用Flash会话数据在Laravel中使用Flash会话数据Mar 12, 2025 pm 05:08 PM

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

PHP记录:PHP日志分析的最佳实践PHP记录:PHP日志分析的最佳实践Mar 10, 2025 pm 02:32 PM

PHP日志记录对于监视和调试Web应用程序以及捕获关键事件,错误和运行时行为至关重要。它为系统性能提供了宝贵的见解,有助于识别问题并支持更快的故障排除

php中的卷曲:如何在REST API中使用PHP卷曲扩展php中的卷曲:如何在REST API中使用PHP卷曲扩展Mar 14, 2025 am 11:42 AM

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

简化的HTTP响应在Laravel测试中模拟了简化的HTTP响应在Laravel测试中模拟了Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

在Codecanyon上的12个最佳PHP聊天脚本在Codecanyon上的12个最佳PHP聊天脚本Mar 13, 2025 pm 12:08 PM

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

解释PHP中晚期静态结合的概念。解释PHP中晚期静态结合的概念。Mar 21, 2025 pm 01:33 PM

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸

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

本文讨论了将自定义功能添加到框架上,专注于理解体系结构,识别扩展点以及集成和调试的最佳实践。

See all articles

热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.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。