




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章PHP面向对象程序设计《PHP+MySQL动态网站开发》学习目标/Target
了解面向对象的概念,能够说出面向过程与面向对象的区别、类与对象的概念
以及面向对象的三大特性。
掌握类的定义和实例化,能够定义类和实例化类。
掌握类成员的定义,能够在类中定义类成员。
掌握对象的克隆方法,能够根据需求克隆对象。
掌握访问控制修饰符的使用方法,能够正确使用访问控制修饰符。学习目标/Target
掌握$this的使用方法,能够在类中使用$this访问实例成员。
掌握构造方法和析构方法的使用方法,能够使用这两个方法完成对象的初始化
和销毁。
掌握类常量和静态成员的使用方法,能够在类中定义类常量和静态成员。
掌握继承的使用方法,能够实现类的继承和有限继承。
掌握重写的使用方法,能够实现对类成员的重写。学习目标/Target
掌握静态延迟绑定,能够根据需求访问类的静态成员。
掌握final关键字的使用方法,能够使用final关键字定义最终类和类成员。
掌握抽象类和抽象方法的概念,并能够根据实际需求使用抽象类和抽象方法。
掌握接口的实现方法,能够定义和实现接口。
掌握接口的继承方法,能够根据实际需求使用接口的继承。学习目标/Target
掌握Trait的使用方法,能够在开发中使用Trait实现代码复用。
掌握Iterator的使用方法,能够使用Iterator遍历对象。
掌握Generator的使用方法,能够高效地遍历包含大量数据的对象。
掌握命名空间的使用方法,能够定义、访问和导入命名空间。
掌握异常处理方法,能够在程序中抛出和捕获异常,并实现多异常捕获处理。章节概述/Summary随着PHP的不断发展,PHP对面向对象程序设计的支持也越来越完善,使得PHP能够处理更多复杂的需求。对PHP开发者来说,PHP面向对象程序设计是必备的重要技能之一。本章将对PHP面向对象程序设计进行详细讲解。目录/Contents10.110.210.3初识面向对象类与对象的使用类常量和静态成员10.4继承目录/Contents10.510.610.7抽象类和抽象方法接口Trait代码复用10.8Iterator迭代器目录/Contents10.910.1010.11Generator生成器命名空间异常处理初识面向对象10.1
先定一个小目标!了解面向过程和面向对象的区别,能够说出面向过程和面向对象的区别。10.1.1面向过程与面向对象的区别10.1.1面向过程与面向对象的区别面向过程是指将要实现的功能分解成具体的步骤,通过函数依次实现这些步骤,使用功能时按规定好的顺序调用函数即可。面向过程面向对象面向对象则是一种更符合人类思维习惯的编程思想,它分析现实生活中不同事物的各种形态,在程序中使用对象来映射现实中的事物,是对现实世界的抽象。10.1.1面向过程与面向对象的区别对象的使用面向对象示例代码//输出学生对象的姓名echo$student->name;//让学生对象打招呼$student->sayHello();//老师布置作业$work=$teacher->createWork();//学生做作业$result=$student->doWork($work);//老师批改作业$score=$teacher->check($result);//输出学生的作业成绩echo$student->name.'的考试成绩为:'.$score;主要侧重于用什么对象解决什么问题,每一个对象中都包含了若干属性和方法可以很直观地看到对象与对象之间做了什么事情,代码的可读性很强
先定一个小目标!了解面向对象中的类与对象,能够说出类与对象的概念。10.1.2面向对象中的类与对象面向对象的思想力图使程序对事物的描述与该事物在现实中的形态一致,为了做到这一点,面向对象思想提出了两个概念:类(class)是对某一类事物的抽象描述,类中包含该类事物的一些基本特征。对象(object)用于表示现实中该事物的个体。对象是根据类创建的,类是对象的模板,通过一个类可以创建多个对象。10.1.2面向对象中的类与对象类与对象的关系:10.1.2面向对象中的类与对象
先定一个小目标!了解面向对象的三大特性,能够说出面向对象的三大特性。10.1.3面向对象的三大特性封装面向对象三大特性封装是面向对象的核心思想,它是指将对象的一部分属性和方法封装起来,同时对外提供可以操作的接口。封装的优势是让对象的使用者不必研究对象的内部原理即可轻松地使用对象提供的功能。继承继承是实现代码复用的重要特性。继承描述了类与类之间的关系,将类分为父类和子类,子类通过继承可以直接使用父类的成员。继承的优势是增强代码复用性,提高开发效率,为修改补充提供了便利。多态多态是指同名操作可作用于多种类型的对象上并获取不同结果。多态的优势是让不同的对象拥有相同的操作接口,降低使用者的学习成本。10.1.3面向对象的三大特性类与对象的使用10.2
先定一个小目标!掌握类的定义,能够定义类。10.2.1类的定义类由class关键字、类名和类成员组成。语法格式class类名{
类成员}10.2.1类的定义类名不区分大小写,如Student、student表示同一个类。推荐使用大驼峰法命名类,即每个单词的首字母大写,如Student。类名要“见其名知其意”,如Student表示学生类,Teacher表示教师类。使用示例classPerson{}
先定一个小目标!掌握类的实例化,能够实例化类。10.2.2类的实例化若想使用类的功能,需要根据类创建对象,这个操作称为类的实例化。通过类的实例化创建的对象称为类的实例(Instance),使用new关键字可以创建类的实例。语法格式$对象名=new类名([参数1,参数2,…]);10.2.2类的实例化演示实例化类:$person=newPerson(); //实例化Person类var_dump($person); //输出结果:object(Person)#1(1){}10.2.2类的实例化多学一招:instanceof运算符instanceof运算符使用instanceof运算符可以判断对象是不是某个类的实例,具体语法格式如下:$对象名instanceof类名instanceof左侧是某个类的实例,右侧是类名。如果判断成立,判断结果为true,否则判断结果为false。对于一个子类对象,如果右侧是父类的类名,判断结果也为true。多学一招:instanceof运算符instanceof运算符演示instanceof运算符的使用:classOther //定义Other类{}classPerson //定义Person类{}$person=newPerson();var_dump($personinstanceofPerson); //输出结果:bool(true)var_dump($personinstanceofOther); //输出结果:bool(false)
先定一个小目标!掌握类成员的定义,能够在类中定义类成员。10.2.3类成员类成员定义在类名后的“{}”中。类成员包括属性和方法。属性类似于变量,用于描述对象的特征,如人的姓名、年龄等。方法类似函数,用于描述对象的行为,如说话、走路等。10.2.3类成员在类中定义类成员:语法格式class类名{
访问控制修饰符$属性名=值; //定义属性访问控制修饰符function方法名([参数1,参数2,…]) //定义方法
{
方法体
}}10.2.3类成员定义类成员后,在创建类的对象时,程序会依据类成员创建对象成员。对象成员又称为实例成员,使用对象成员访问符“->”可以访问对象成员。语法格式$对象名->属性名; //访问属性$对象名->方法名(); //访问方法(调用方法)10.2.3类成员演示类成员的使用:classPerson{
public$name='未命名';
//定义属性
publicfunctionspeak()
//定义方法
{
echo'Thepersonisspeaking.';
}}$person=newPerson(); //实例化Person类echo$person->name;
//获取属性值,输出结果:未命名$person->name='张三'; //修改属性值echo$person->name; //获取属性值,输出结果:张三$person->speak();
//输出结果:Thepersonisspeaking.10.2.3类成员
先定一个小目标!掌握对象的克隆方法,能够根据需求克隆对象。10.2.4对象的克隆当把一个值为对象的变量赋值给另一个变量时,并不会得到两个同样的对象,而是让两个变量引用了同一个对象。这样的机制有利于节省内存空间。如果想要获取多个相同的对象,并且让其中一个对象的成员发生改变时不影响其他对象的成员,可以通过对象的克隆(Clone)来实现。10.2.4对象的克隆对象的克隆使用clone关键字实现:语法格式$对象名2=clone$对象名1;10.2.4对象的克隆对比对象变量赋值和对象克隆的区别:对象变量赋值classPerson{public$age=1;}$object1=newPerson();$object2=$object1;$object1->age=10;var_dump($object1->age);//输出结果:int(10)var_dump($object2->age);//输出结果:int(10)10.2.4对象的克隆对象克隆classPerson{public$age=1;}$object1=newPerson();$object2=clone$object1;$object1->age=10;var_dump($object1->age);//输出结果:int(10)var_dump($object2->age);//输出结果:int(1)多学一招:魔术方法魔术方法魔术方法不需要手动调用,它会在某一刻自动执行,使用魔术方法可以为程序的开发带来极大便利。常见的魔术方法:魔术方法描述__get()当调用一个未定义或无权访问的属性时自动调用此方法__set()当给一个未定义或无权访问的属性赋值时自动调用此方法__isset()当在一个未定义或无权访问的属性上执行isset()操作时调用此方法__unset()当在一个未定义或无权访问的属性上执行unset()操作时调用此方法__construct()构造方法,当一个对象被创建时自动调用此方法__destruct()析构方法,在对象被销毁前(即从内存中清除前)自动调用此方法1/2多学一招:魔术方法魔术方法魔术方法描述__toString()将一个类当成字符串调用时会调用此方法__invoke()当以调用函数的方式调用一个对象时会被自动调用__sleep()用于清理对象,在serialize()序列化前执行__wakeup()用于预先准备对象需要的资源,在unserialize()反序列化前执行__call()在对象中调用一个不可访问的方法时会被调用__callstatic()当在静态上下文中调用一个不可访问的方法时会被调用,该方法需要声明为静态方法__clone()实现对象的克隆2/2多学一招:魔术方法魔术方法在Person类中使用__clone()魔术方法:classPerson{
publicfunction__clone(){echo'__clone()魔术方法被执行了';}}
先定一个小目标!掌握访问控制修饰符的使用方法,能够正确使用访问控制修饰符。10.2.5访问控制修饰符访问控制修饰符用于控制类成员是否允许被外界访问。访问控制修饰符有3个:public(公有修饰符)protected(保护成员修饰符)private(私有修饰符)10.2.5访问控制修饰符访问控制修饰符的作用范围:10.2.5访问控制修饰符访问控制修饰符同一个类内子类类外public允许访问允许访问允许访问protected允许访问允许访问不允许访问private允许访问不允许访问不允许访问演示访问控制修饰符的使用方法:10.2.5访问控制修饰符classUser{
public$name='张三'; //姓名
protected$phone='400-123456';
//电话
private$money='5000'; //存款}$user=newUser();echo$user->name; //输出结果:张三echo$user->phone; //报错echo$user->money; //报错注意:在定义类时,属性前必须有访问控制修饰符,否则会报错;如果没有为方法指定访问控制修饰符,则默认为public。10.2.5访问控制修饰符
先定一个小目标!掌握$this的使用方法,能够在类中使用$this访问实例成员。10.2.6类中的$this访问实例成员时,应使用类实例化后的对象进行访问。如果想在类的方法中访问实例成员,则可以使用特殊变量$this实现。$this代表当前对象,使用它能够在类的方法中访问实例成员。10.2.6类中的$this通过代码验证$this是否代表当前对象:classUser{publicfunctioncheck($user){return$this===$user;}}$user=newUser();var_dump($user->check($user)); //输出结果:bool(true)输出结果true表示$this就是当前对象。10.2.6类中的$this演示$this的使用方法:classUser{public$name='张三'; //姓名
protected$phone='400-123456'; //电话
private$money='5000'; //存款
publicfunctiongetAll()
{
echo$this->name,'';echo$this->phone,'';echo$this->money,'';}}$user=newUser();$user->getAll(); //输出结果:张三400-123456500010.2.6类中的$this
先定一个小目标!掌握构造方法的语法,能够使用构造方法完成对象的初始化。10.2.7构造方法构造方法是一种特殊的方法,用于在创建对象时进行初始化操作,例如为对象的属性进行赋值、设定默认值等。构造方法在创建对象时自动调用,无须手动调用。每个类都有一个构造方法。如果没有显式地为类定义构造方法,PHP会自动生成一个没有参数且没有任何操作的默认构造方法;如果显式地为类定义了构造方法,默认构造方法将不存在。10.2.7构造方法定义构造方法的语法格式:语法格式访问控制修饰符function__construct([参数1,参数2,…]){
方法体}构造方法的访问控制修饰符默认是public10.2.7构造方法演示构造方法的使用方法:classUser{public$name;
publicfunction__construct($name='user'){$this->name=$name;}}$obj1=newUser();$obj2=newUser('Tom');echo$obj1->name;//输出结果:userecho$obj2->name;//输出结果:Tom10.2.7构造方法
先定一个小目标!掌握析构方法的语法,能够使用析构方法完成对象的销毁。10.2.8析构方法析构方法在对象被销毁之前自动调用,用于执行一些指定功能或操作,例如,关闭文件、释放结果集等。在使用unset()释放对象或者PHP脚本运行结束自动释放对象时,析构方法会自动调用。10.2.8析构方法定义析构方法的语法格式:语法格式访问控制修饰符function__destruct([参数1,参数2,…]){
方法体}10.2.8析构方法演示析构方法的使用方法:classUser{
publicfunction__destruct()
{
echo'执行了析构方法';
}}$obj=newUser();unset($obj);//输出结果:执行了析构方法10.2.8析构方法类常量和静态成员10.3
先定一个小目标!掌握类常量的使用方法,能够在类中定义类常量。10.3.1类常量在PHP中,通过类常量可以在类中保存一些不变的值。在类中使用const关键字定义类常量:语法格式访问控制修饰符const类常量名称='常量值';10.3.1类常量通过范围解析操作符“::”访问类常量:语法格式类名::类常量名称在类中定义类常量并通过类访问类常量:classStudent{
constSCHOOL='某学校';
//定义类常量}echoStudent::SCHOOL; //访问类常量10.3.1类常量
先定一个小目标!掌握静态成员的使用方法,能够在类中定义静态成员。10.3.2静态成员如果想让类中的某个成员只保存一份,并且可以通过类直接访问,可以将这个成员定义为静态成员。静态成员包括静态属性和静态方法。静态成员使用static关键字修饰。语法格式publicstatic$属性名; //定义静态属性publicstatic方法名(){} //定义静态方法10.3.2静态成员在类外访问静态成员时,不需要创建对象,直接通过类名访问:在类外访问静态成员类名::$属性名; //访问静态属性类名::方法名(); //访问静态方法(调用静态方法)10.3.2静态成员在类内可以使用self和static关键字配合“::”访问静态成员,self和static关键字在类的内部代替类名,当类名发生变化时,不需要修改类的内部代码。10.3.2静态成员在类内访问静态成员self::$属性名; //使用self访问静态属性self::方法名(); //使用self访问静态方法(调用静态方法)static::$属性名; //使用static访问静态属性static::方法名(); //使用static访问静态方法(调用静态方法)演示静态成员的定义和访问:classStudent{publicstatic$age='18';publicstaticfunctionshow(){echoself::$age;
//在类内使用self关键字访问静态属性
echostatic::$age; //在类内使用static关键字访问静态属性
}}Student::$age;
//在类外访问静态属性Student::show(); //在类外访问静态方法10.3.2静态成员
先定一个小目标!掌握面向对象的使用,能够使用面向对象的思想来实现数据库操作类的封装。10.3.3【案例】封装数据库操作类在第9章使用MySQLi扩展操作数据库时,是使用面向过程的思想来实现的。本案例将使用面向对象的思想来实现数据库操作类的封装,简化数据库的初始化操作,实现读写操作的封装。
案例需求10.3.3【案例】封装数据库操作类①创建Sql.php文件,用来封装数据库操作类。②创建构造方法,初始化数据库信息。③创建connect()方法连接数据库。④封装执行读写操作的方法。⑤在浏览器中查看运行结果。
实现思路10.3.3【案例】封装数据库操作类继承10.4
先定一个小目标!掌握继承的使用,能够实现类的继承。10.4.1继承的实现在PHP中,类的继承是指在一个现有类的基础上构建一个新类,构建出来的新类被称作子类或派生类,现有类被称作父类或基类,子类自动拥有父类所有可继承的属性和方法。当子类和父类有同名的类成员时,子类的类成员会覆盖父类的类成员。10.4.1继承的实现10.4.1继承的实现语法格式class子类名extends
父类名{}使用extends关键字实现子类与父类之间的继承://定义子类Man类,继承People类classManextendsPeople{publicfunction__construct($name){$this->name=$name;}}$man=newMan('Tom');echo$man->name;
//输出结果:Tom$man->say();
//输出结果:Tomisspeaking10.4.1继承的实现//定义父类People类classPeople{public$name;publicfunctionsay(){echo$this->name.'isspeaking';}}演示继承的实现:
先定一个小目标!掌握有限继承的使用方法,能够实现有限继承。10.4.2有限继承有限继承是指子类在继承父类时,受访问控制修饰符的限制,不能继承父类的所有内容,而只能继承父类的部分内容。有限继承的内容:10.4.2有限继承访问控制修饰符属性方法public可以继承可以继承protected可以继承可以继承private可以继承不能继承演示有限继承,定义People类:classPeople{
public$name='Tom'; //公有属性
protected$age='20'; //受保护属性
private$money='5000'; //私有属性
publicfunctionshowName()
{ //公有方法echo$this->name;}
protectedfunctionshowAge(){ //受保护方法
echo$this->age;}
privatefunctionshowMoney(){ //私有方法
echo$this->money;}}10.4.2有限继承定义Man类继承People类:classManextendsPeople{publicfunctiongetProtected(){echo$this->showAge();}publicfunctiongetPrivate(){echo$this->money;$this->showMoney();}}10.4.2有限继承实例化Man类:$man=newMan();var_dump($man);输出结果:object(Man)#1(3){["name"]=>string(3)"Tom"["age":protected]=>string(2)"20"["money":"People":private]=>string(4)"5000"}10.4.2有限继承通过Man类对象调用公有方法showName()、getProtected()和getPrivate():$man->showName(); //输出结果:Tom$man->getProtected(); //输出结果:20$man->getPrivate(); //报错私有属性可以被继承,但是无法在子类内部访问;私有方法不能被继承10.4.2有限继承
先定一个小目标!掌握重写的使用方法,能够实现对类成员的重写。10.4.3重写重写是指在子类中重写父类的同名成员。在重写父类的属性时,子类的属性会直接覆盖父类的属性,父类的属性将不再存在。在重写父类的方法时,子类的方法和父类的方法同时存在,重写的方法的访问权限必须和父类的方法访问权限一致或更加开放。通过重写父类的方法可以实现扩展或修改业务逻辑的目的。10.4.3重写演示重写的使用方法,定义People类:classPeople{public$name='People';publicfunctionshow(){echo__CLASS__;}publicfunctionsay(){echo__CLASS__.'say';}}10.4.3重写定义Man类继承People类:classManextendsPeople{public$name='Man';publicfunctionshow(){echo__CLASS__;}publicfunctionsay(){echo__CLASS__.'say';}}10.4.3重写实例化Man类,调用show()方法和say()方法:$man=newMan();var_dump($man); //object(Man)#1(1){["name"]=>string(3)"Man"}$man->show(); //输出结果:Man$man->say();
//输出结果:Mansay10.4.3重写将Man类中say()方法的访问控制修饰符修改为protected,再次运行程序时会报错:Fatalerror:AccessleveltoMan::say()mustbepublic(asinclassPeople)in…多学一招:parent关键字parent关键字子类在重写父类的方法后,如果想继续使用父类的方法,可以使用parent关键字配合范围解析操作符调用父类的方法。语法格式parent::父类的方法();多学一招:parent关键字parent关键字在子类中调用父类方法:示例代码classManextendsPeople{publicfunctionshow()
{
parent::show();}}
先定一个小目标!掌握静态延迟绑定,能够根据需求访问静态类成员。10.4.4静态延迟绑定静态绑定是指在访问静态成员时,访问本类的静态成员。类可以自下而上调用父类的方法,如果需要在父类中根据不同的子类调用子类的方法,就需要实现静态延迟绑定。所谓静态延迟绑定是在访问静态成员时,访问实际运行的类的静态成员,而不是访问原本定义的类的静态成员。静态绑定使用self关键字来实现,静态延迟绑定使用static关键字来实现,只适用于对静态属性和静态方法进行延迟绑定。10.4.4静态延迟绑定静态延迟绑定的示例代码:classPeople{publicstatic$name='People';publicstaticfunctionshowName()
{
echoself::$name; //静态绑定
echostatic::$name; //静态延迟绑定
}}classManextendsPeople{publicstatic$name='Man';}People::showName();
//输出结果:PeoplePeopleMan::showName();
//输出结果:PeopleMan10.4.4静态延迟绑定
先定一个小目标!掌握final关键字的使用方法,能够使用final关键字定义最终类和类成员。10.4.5final关键字在类成员前面添加final关键字,表示这些内容不能被修改。10.4.5final关键字语法格式finalclass类名
//最终类{final
publicconst常量名=常量值; //最终常量
finalpublicfunction方法名(){} //最终方法}使用final关键字修饰的类不能被继承,只能被实例化,这样的类被称为最终类。使用final关键字修饰常量,表示该类的子类不能重写这个常量,这样的常量被称为最终常量。使用final关键字修饰方法,表示该类的子类不能重写这个方法,这样的方法被称为最终方法。演示final关键字的使用:classPerson{
finalpublicconstAGE=18; //最终常量
finalpublicfunctionshow() //最终方法
{}}classStudentextendsPerson{publicconstAGE=20; //报错
publicfunctionshow() //报错
{}}10.4.5final关键字不能重写Person类的最终常量和最终方法抽象类和抽象方法10.5
先定一个小目标!掌握抽象类和抽象方法的概念,并能够根据实际需求使用抽象类和抽象方法10.5抽象类和抽象方法抽象类是一种特殊的类,它用于定义某种行为,具体的实现需要由子类完成。例如,完成跑步有多种方式,如基础跑、长距离跑、减速跑等。此时,可以定义跑步类为抽象类,将基础跑这些实现方式定义为抽象方法。10.5抽象类和抽象方法使用abstract关键字定义抽象类和抽象方法。语法格式abstractclass类名
//定义抽象类{
abstractpublicfunction方法名(); //定义抽象方法}10.5抽象类和抽象方法在使用abstract修饰类或方法时还应注意以下6点:①抽象方法是特殊的方法,只有方法定义,没有方法体。②含有抽象方法的类必须被定义成抽象类。③抽象类中可以有非抽象方法、属性和常量。④抽象类不能被实例化,只能被继承。⑤子类实现抽象类中的抽象方法时,子类的方法的访问权限必须与抽象类中的一致或者比抽象类中的更开放。⑥子类继承抽象类时必须实现抽象方法,否则必须定义成抽象类,由下一个继承类实现。10.5抽象类和抽象方法演示抽象类和抽象方法的使用:abstractclassHuman{protectedabstractfunctioneat();}abstractclassManextendsHuman{}classBoyextendsMan{publicfunctioneat(){echo'eat';}}实现抽象方法时,需要保证实现方法和抽象方法的访问权限一致,或实现方法的访问权限比抽象方法的更加开放10.5抽象类和抽象方法接口10.6
先定一个小目标!掌握接口的实现方法,能够定义和实现接口。10.6.1接口的实现接口用于指定某个类必须实现的功能,通过interface关键字来定义。在接口中,所有的方法只能是公有的,不能使用final关键字修饰。语法格式interface接口名{const常量名=''; //接口常量
publicfunction方法名(); //接口方法}10.6.1接口的实现接口的方法体没有具体实现,因此,需要通过某个类使用implements关键字来实现接口。语法格式class类名implements
接口名{}10.6.1接口的实现演示接口的定义和实现:interfaceHuman{constNAME=''; //接口常量
publicfunctioneat(); //接口方法}classManimplementsHuman{publicfunctioneat() //实现接口方法
{}}10.6.1接口的实现
先定一个小目标!掌握接口的继承方法,能够根据实际需求使用接口继承。10.6.2接口的继承接口可以被继承,从而实现接口的成员扩展。虽然PHP中子类只能继承一个父类,也就是只能实现单继承,但是接口和类不同,接口可以实现多继承,即可以一次继承多个接口。语法格式interfaceA{}interfaceB{}//接口继承interfaceCextendsA{}//接口多继承interfaceDextends
A,B{}10.6.2接口的继承演示接口继承的使用方法:interfaceHuman{publicfunctionwalk();publicfunctiontalk();}interfaceAnimal{publicfunctioneat();publicfunctiondrink();}interfaceMonkeyextendsHuman,Animal{publicfunctionsleep(){};}10.6.2接口的继承Trait代码复用10.710.7.1Trait的实现
先定一个小目标!掌握定义和引入Trait的语法,能够在类中定义和引入Trait。10.7.1Trait的实现Trait的结构类似于类的结构,可以定义属性和方法,不能定义常量。语法格式trait名字{
属性和方法}10.7.1Trait的实现在Trait中定义属性和方法后,需要在类中引入Trait,实现Trait复用。使用use关键字可以引入Trait,引入多个Trait时,多个Trait之间使用逗号分隔。在类中引入Trait的语法格式:语法格式class类名{usetrait名字;usetrait名字1,trait名字2;}10.7.2Trait同名方法的处理
先定一个小目标!掌握Trait同名方法的处理,能够通过替代或设置别名解决同名问题。当一个类中使用了多个Trait,并且这些Trait中有同名方法时,那么在类中调用该方法时,会出现命名冲突问题。为了解决这个问题,可以用关键字替代方法或给方法设置别名。insteadof关键字用于替代某个Trait的方法,as关键字用于给某个Trait的方法设置别名。10.7.2Trait同名方法的处理通过案例演示如何在两个Trait中含有同名属性或方法时,通过替代和设置别名的方式完成方法的调用。10.7.2Trait同名方法的处理STEP03STEP01定义名称为T1和T2的Trait。10.7.2Trait同名方法的处理traitT1{publicfunctioneat(){echo'T1,eat';}}traitT2{publicfunctioneat(){echo'T2,eat';}}STEP03STEP02定义Person类。10.7.2Trait同名方法的处理classPerson{useT1,T2{
T1::eatinsteadofT2;
T2::eatasshow;}}$person=newPerson();$person->eat(); //输出结果:T1,eat$person->show(); //输出结果:T2,eat
先定一个小目标!掌握Trait中同名方法的调用顺序,能够根据优先级调用同名方法。10.7.3Trait优先级当类之间有继承关系并且引入了Trait时,Trait在引入过程中可能与类本身或类的父类拥有同名成员。当出现同名属性时,必须保证同名同值,否则程序报错。当出现同名方法时,系统会认定该方法是重写的,方法调用的优先级为:“子类>Trait>父类”。10.7.3Trait优先级通过案例演示子类、Trait和父类中存在同名方法时方法调用的优先级。10.7.3Trait优先级STEP01定义Trait和类。10.7.3Trait优先级traitEat{publicfunctioneat(){echo'Eat::eat';}}classHuman{publicfunctioneat(){echo'Human::eat';}}classMan
extends
Human{useEat;publicfunctioneat(){echo'Man::eat';}}Trait父类子类STEP02实例化Man类并调用eat()方法。10.7.3Trait优先级$man=newMan();$man->eat(); //输出结果:Man::eat优先调用Man类的eat()方法Iterator迭代器10.810.8Iterator迭代器
先定一个小目标!掌握Iterator的使用方法,能够使用Iterator遍历对象。Iterator(迭代器)是一个接口,它能够修改foreach语句的内部运行机制。当使用foreach语句遍历实现了Iterator接口的类的对象时,原有的遍历机制会被替代,改为根据Iterator接口的抽象方法来进行迭代操作。10.8Iterator迭代器10.8Iterator迭代器Iterator内置了5个抽象方法,实现Iterator接口的类必须实现这5个抽象方法。current():返回当前元素。key():返回当前元素的键。next():向前移动到下一个元素。rewind():返回到第一个元素。valid():检查当前位置是否有效。通过案例演示如何使用Iterator。10.8Iterator迭代器STEP01定义Man类实现Iterator接口。classManimplementsIterator{private$info=['name'=>'1','age'=>0];publicfunctioncurrent():mixed{returncurrent($this->info);}publicfunctionkey():mixed{returnkey($this->info);}
……(其他实现方法见下一页)}10.8Iterator迭代器STEP02定义Man类实现Iterator接口。classManimplementsIterator{
……publicfunctionnext():void{next($this->info);}publicfunctionrewind():void
{reset($this->info);}publicfunctionvalid():bool
{returnisset($this->info[key($this->info)]);}}10.8Iterator迭代器STEP03实例化Man类并使用foreach语句遍历对象。$man=newMan();foreach($manas$key=>$val){echo$key.'='.$val.'&';//输出结果:name=1&age=0&}在使用foreach语句遍历对象时,实际使用的是类中实现的Iterator的抽象方法10.8Iterator迭代器Generator生成器10.910.9Generator生成器
先定一个小目标!掌握Generator的使用方法,能够使用Generator遍历对象。Generator(生成器)提供了一种更容易的方法实现对象迭代。Generator实现了Iterator接口,并且实现了Iterator接口中的抽象方法。当遍历的数据量比较大时,使用Generator可以减少内存开销:在Generator中使用yield关键字定义暂停点,用于暂停循环的执行,再次调用时才会继续执行循环。和普通迭代对象的方式相比,使用Generator可以显著减少内存开销。10.9Generator生成器functionmyArray(){for($i=0;$i<10000;$i++){$arr[]=$i;}return$arr;}$arr=myArray();foreach($arras$v){echo$v.PHP_EOL;}echomemory_get_usage();//输出结果:66124810.9Generator生成器使用普通迭代对象的方式遍历数组所占用的内存:10.9Generator生成器使用Generator遍历数组所占用的内存:functionmyGenerator(){for($i=0;$i<10000;$i++){yield$i;}}$obj=myGenerator();for($i=0;$i<10000;$i++){echo$obj->current().PHP_EOL;$obj->next();}echomemory_get_usage();//输出结果:394544使用Generator占用的内存比使用普通迭代对象的方式少,减少了内存的消耗。命名空间10.10
先定一个小目标!掌握命名空间的使用方法,能够定义、访问和导入命名空间10.10.1命名空间的定义使用命名空间可以解决不同类库之间的命名冲突问题。定义命名空间使用namespace关键字。语法格式namespace空间名称;空间名称遵循标识符命名规则,由数字、字母和下划线组成,且不能以数字开头10.10.1命名空间的定义定义命名空间时,只有declare关键字可以出现在第一条定义命名空间的语句之前。如果第一个定义命名空间的语句之前有其他PHP代码,会出现Fatalerror错误信息。其中,declare关键字用于设置或修改指定代码块的运行时配置选项。演示命名空间的定义:示例代码<?phpnamespaceApp;/*此处编写PHP代码*/示例代码<?phpdeclare(ticks=1);namespaceApp;/*此处编写PHP代码*/演示如何在定义命名空间前使用declare语句:10.10.1命名空间的定义一个目录下可以创建多个目录和文件,同样,命名空间也可以指定多个层次。非顶层的命名空间被称为子命名空间。定义子命名空间的示例代码:示例代码<?phpnamespaceApp\Http\Controllers;/*此处编写PHP代码*/10.10.1命名空间的定义
先定一个小目标!掌握命名空间的访问,能够使用不同的方式访问命名空间。10.10.2命名空间的访问虽然任意合法的PHP代码都可以包含在命名空间中,但只有类、接口、函数和常量受命名空间影响,这些受命名空间影响的内容也被称为空间成员。PHP提供了3种访问命名空间的方式:非限定名称访问限定名称访问完全限定名称访问10.10.2命名空间的访问1.非限定名称访问非限定名称访问是指直接访问空间成员,不指定空间名称。这种方式只能访问当前代码向上寻找到的第1个命名空间内的成员,当找到的命名空间中不存在指定的空间成员时,PHP会报错。2.限定名称访问限定名称访问是指从当前命名空间开始,访问其子命名空间的成员。限定名称访问的语法格式:语法格式空间名称\空间成员名称;10.10.2命名空间的访问3.完全限定名称访问完全限定名称访问是指在任意的命名空间中访问从根命名空间开始的任意命名空间的成员。完全限定名称访问的语法格式:语法格式\空间名称\空间成员名称;10.10.2命名空间的访问演示3种命名空间的访问方式:namespace01.php<?phpnamespacetwo\one;constPI=3.14;echoPI;//非限定名称访问namespace02.php<?phpnamespacetwo;require'./namespace01.php';echoone\PI;//限定名称访问echo\two\one\PI;//完全限定名称访问10.10.2命名空间的访问
先定一个小目标!掌握导入命名空间的方法,能够导入命名空间和导入空间成员。10.10.3命名空间的导入当在一个命名空间中使用其他命名空间的空间成员时,每次都在空间成员前面加上路径的操作比较烦琐,使用可以使用use关键字导入指定的命名空间或空间成员。语法格式use命名空间或空间成员;10.10.3命名空间的导入当导入的空间成员为函数时,需要在use后面添加function关键字。当导入的空间成员为常量时,需要在use后面添加const关键字。语法格式usefunction函数的命名空间;useconst常量的命名空间;为了避免导入的空间成员和已有内容重名,可以使用as关键字为导入的空间成员设置别名。语法格式use空间成员as别名;10.10.3命名空间的导入1.导入命名空间导入命名空间通常指在类中导入其他类的命名空间,示例代码如下。<?phpnamespacemyframe;useApp\Http\Controllers;cl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 兴趣班退费合同样本
- 住宅式公寓合同标准文本
- 中介股东协议合同标准文本
- 关于房产合同标准文本规定
- 关于设计合同标准文本
- 借用账户走账合同标准文本
- 公司外聘员工合同标准文本
- 中药饮代煎服务合同样本
- 不签续约合同样本
- 买方合同标准文本
- 中小学国家教育智慧平台
- 类医疗器械经营质量管理制度及工作程序
- 2025交管12123学法减分考试题库和答案
- T-JDFA 02-2024 江苏省转型融资主体认定评价标准
- 5共同建设有序生活(教学设计)-统编版道德与法治五年级上册
- 2025年新闻、记者采编人员岗位职业技能资格基础知识考试题库(附答案)
- 2025年吉林铁道职业技术学院单招职业技能测试题库一套
- 生物化学习题集(护理)
- 2025年化妆品包装标签法律要求培训
- 中间人协议书范本(2025年)
- 新外研版高二英语选择性必修三unit2 life behind the lens课件
评论
0/150
提交评论