细说PHP笔记04(第8章)--面向对象-类的声明、实例化,对象在内存中的分配,成员方法,$this,构造方法与析构方法,修饰符,魔术方法,继承,重载,单例模式,类通用方法,序列化,抽象类,接口,混入

1、类的声明
[修饰符] class 类名{
	var 成员属性
	function 成员方法
}

成员属性需要使用var来声明,前面可以加修饰符
修饰符有:
private
public
static
含义同java

2、类的实例化

$变量名=new 类名(参数列表)
$变量名=new 类名

<?php
class Person{
	var $name;
	var $age;
	var $address;

	function callname($name){
		echo "my name is {$name}";
	}

	function gotoArmy($name,$age,$address){
		echo "when he was {$age} years old,{$name} deside goto army from {$address}";
	}
}

$xiaomin=new Person();
$xiaomin->name="xiaomin";
$xiaomin->age=17;
$xiaomin->address="beijing";

$xiaomin->callname($xiaomin->name);
echo "<br>";
$xiaomin->gotoArmy("zhangsan", $xiaomin->age, $xiaomin->address);

?>
3、对象类型在内存中的分配
  • 栈空间段:小且快
  • 堆空间段:动态变化
  • 初始化数据段:存放可执行文件中已初始化的全局变量。即程序静态分配的变量
  • 代码段:存放可执行文件的操作指令,是可执行程序在内存中的镜像。
  • 栈空间可以直接存取,堆控件需要通过对象的引用名称访问
  • new一个实例就是开辟了一块堆空间
4、对象中成员的方法

$引用名=new 类名称(参数列表)

$引用名->成员属性=属性值
$引用名->成员方法

案例见上例

5、$this

使用$this来替代当前调用对象

<?php
class Person{
	var $name;
	var $age;
	var $address;

	function callname(){
		echo "my name is {$this->name}";
	}

	function gotoArmy(){
		echo "when he was {$this->age} years old,{$this->name} deside goto army from {$this->address}";
	}
}

$xiaomin=new Person();
$xiaomin->name="xiaomin";
$xiaomin->age=17;
$xiaomin->address="beijing";

$xiaomin->callname();
echo "<br>";
$xiaomin->gotoArmy();

?>
6、构造方法和析构方法

1、构造方法__construct
格式:

function __construct(参数列表){
}

案例:

<?php
class Person{
	function __construct($name,$age,$address){
		$this->name=$name;
		$this->age=$age;
		$this->address=$address;
	}

	var $name;
	var $age;
	var $address;

	function callname(){
		echo "my name is {$this->name}";
	}

	function gotoArmy(){
		echo "when he was {$this->age} years old,{$this->name} deside goto army from {$this->address}";
	}
}

$xiaomin=new Person("zhangsan",45,"fujian");

$xiaomin->callname();
echo "<br>";
$xiaomin->gotoArmy();

?>

2、析构方法__destruct

function __destruct(){
}

对象销毁时执行的方法

<?php
class Person{
	function __construct($name,$age,$address){
		$this->name=$name;
		$this->age=$age;
		$this->address=$address;
	}

	var $name;
	var $age;
	var $address;

	function callname(){
		echo "my name is {$this->name}";
	}

	function gotoArmy(){
		echo "when he was {$this->age} years old,{$this->name} deside goto army from {$this->address}";
	}

	function __destruct(){
		echo "good bye {$this->name}";
	}

}

$xiaomin=new Person("zhangsan",45,"fujian");

$xiaomin->callname();
echo "<br>";
$xiaomin->gotoArmy();
echo "<br>";
?>
7、private修饰符设置私有成员

1、private修饰符
使用private修饰符设置,同java
可以设置属性,也可以设置方法
使用private后,成员属性的var可以省略掉

2、set,get私有成员的访问
同java

<?php
class Person{
	function __construct(){

	}

	private $name;
	private $age;
	private $address;

	public function setName($name){
		$this->name=$name;
	}
	public function getName(){
		return  $this->name;
	}

	public function setAge($age){
		$this->age=$age;
	}
	public function getAge(){
		return  $this->age;
	}

	public function setAddress($address){
		$this->address=$address;
	}
	public function getAddress(){
		return  $this->address;
	}

	function callname(){
		echo "my name is {$this->name}";
	}

	function gotoArmy(){
		echo "when he was {$this->age} years old,{$this->name} deside goto army from {$this->address}";
	}

	function __destruct(){
		echo "good bye {$this->name}";
	}

}

$xiaomin=new Person();
$xiaomin->setName("zhangsanfeng");
$xiaomin->setAge(12);
$xiaomin->setAddress("hebei");

$xiaomin->callname();
echo "<br>";
$xiaomin->gotoArmy();
echo "<br>";
echo "{$xiaomin->getName()}";
echo "<br>";
?>
8、魔术方法__set(),__get(),__isset(),__unset

预定义__set和__get方法对私有属性进行获取和赋值
__isset()检测私有属性是否存在
__unset()删除私有属性

1、__set()方法
类中定义了__set()方法后,在调用私有属性值的时候将自动调用__setXXX()方法,并对该私有属性赋值
两个参数
第一个参数是属性名(并不需要真的存在这个属性名)
第二个参数是属性值(并不需要真的尊在这个属性值)
即意味着将不特定的属性值赋值给不特定的属性名

<?php
class Person{
	function __construct(){

	}

	private $name;
	private $age;
	private $address;

	//使用魔术方法
	function __set($propName,$propValue){
		$this->$propName=$propValue;//将不特定的属性值赋值个不特定的属性名
	}

	function callname(){
		echo "my name is {$this->name}";
	}

	function gotoArmy(){
		echo "when he was {$this->age} years old,{$this->name} deside goto army from {$this->address}";
	}

	function __destruct(){
		echo "good bye {$this->name}";
	}

}

$xiaomin=new Person();
$xiaomin->name="lisi";
$xiaomin->age=25;
$xiaomin->address="shandong";
$xiaomin->callname();
echo "<br>";
$xiaomin->gotoArmy();
echo "<br>";

?>

2、__get()方法
类中定义了__get()方法后,在调用私有属性值的时候将自动调用__getXXX()方法,并对该私有属性赋值
只有一个属性名参数(并不需要真的存在这个属性名)
即意味着将获得不特定的属性的属性值

<?php
class Person{
	function __construct(){

	}

	private $name;
	private $age;
	private $address;

	//使用魔术方法
	function __set($propName,$propValue){
		$this->$propName=$propValue;
	}
	//使用魔术方法
	function __get($propName){
		return $this->$propName;
	}

	function callname(){
		echo "my name is {$this->name}";
	}

	function gotoArmy(){
		echo "when he was {$this->age} years old,{$this->name} deside goto army from {$this->address}";
	}

	function __destruct(){
		echo "good bye {$this->name}";
	}

}

$xiaomin=new Person();
$xiaomin->name="lisi";
$xiaomin->age=25;
$xiaomin->address="shandong";
$xiaomin->callname();
echo "<br>";
$xiaomin->gotoArmy();
echo "<br>";
echo $xiaomin->address;
echo "<br>";

?>

2、__isset()和__unset()方法

__isset()测试私有属性是否存在
__unset()删除私有属性

对象在外部调用isset()和unset()方法的时候自动调用这俩方法
需要在__isset()和unset()中设置调用isset()和unset()方法,从而实际完成该魔法方法的逻辑

?php
class Person{
	function __construct(){

	}

	private $name;
	private $age;
	private $address;

	//使用魔术方法
	function __set($propName,$propValue){
		$this->$propName=$propValue;//这里是需要带美元符号的
	}
	//使用魔术方法
	function __get($propName){
		return $this->$propName;//这里是需要带美元符号的
	}

	//使用魔术方法
	function __isset($propName){
		return isset($propName);//这里是需要带美元符号的
	}

	//使用魔术方法
	function __unset($propName){

		unset($this->$propName);//这里是需要带美元符号的
	}

	function callname(){
		echo "my name is {$this->name}";
	}

	function gotoArmy(){
		echo "when he was {$this->age} years old,{$this->name} deside goto army from {$this->address}";
	}

	function __destruct(){
		echo "good bye {$this->name}";
	}

}

$xiaomin=new Person();
$xiaomin->name="lisi";
$xiaomin->age=25;
$xiaomin->address="shandong";
echo isset($xiaomin->name);
unset($xiaomin->name);
echo "<br>";
echo isset($xiaomin->name);
echo "<br>";
?>

打印
1
1

Notice: Undefined property: Person::$name in E:\mysite\fengray\ex02\index.php on line 24
good bye

8、extents继承

class 父类名 extents 子类名
其余同java

<?php
class Person{
	function __construct($name,$age,$address){
		$this->name=$name;
		$this->age=$age;
		$this->address=$address;
	}

	var $name;
	var $age;
	var $address;

	function callname(){
		echo "my name is {$this->name}";
	}

	function gotoArmy(){
		echo "when he was {$this->age} years old,{$this->name} deside goto army from {$this->address}";
	}

}

class Student extends Person{
	var $grade;
	var $major;

	function __construct($name,$age,$address,$grade,$major){
		$this->name=$name;
		$this->age=$age;
		$this->address=$address;
		$this->grade=$grade;
		$this->major=$major;
	}

	function study(){
		echo "{$this->name} is study with {$this->major}";
	}
}

$xiaomin=new Person("lisi",34,"hainan");
$xiaomin->gotoArmy();
echo "<br>";

$xiaozhang=new Student("zhaoliu",43,"wuhan","senior","news");
$xiaozhang->name="wanger";
echo $xiaozhang->name;
echo "<br>";
echo $xiaozhang->major;
echo "<br>";
echo $xiaozhang->study();
?>
9、访问控制修饰符

private
proteced
public
同java

10、子类重载父类方法

同java对父类的重载

<?php
class Person{
	function __construct($name,$age,$address){
		$this->name=$name;
		$this->age=$age;
		$this->address=$address;
	}

	var $name;
	var $age;
	var $address;

	function callname(){
		echo "my name is {$this->name}";
	}

	function gotoArmy(){
		echo "when he was {$this->age} years old,{$this->name} deside goto army from {$this->address}";
	}

}

class Student extends Person{
	var $grade;
	var $major;

	function __construct($name,$age,$address,$grade,$major){
		$this->name=$name;
		$this->age=$age;
		$this->address=$address;
		$this->grade=$grade;
		$this->major=$major;
	}

	function study(){
		echo "{$this->name} is study with {$this->major}";
	}

	function gotoArmy(){
		echo "graduted from {$this->major}, {$this->name} deside to be a solider";
	}
}

$xiaomin=new Person("lisi",34,"hainan");
$xiaomin->gotoArmy();
echo "<br>";

$xiaozhang=new Student("zhaoliu",43,"wuhan","senior","news");
$xiaozhang->name="wanger";
echo $xiaozhang->name;
echo "<br>";
echo $xiaozhang->major;
echo "<br>";
echo $xiaozhang->study();
echo "<br>";
echo $xiaozhang->gotoArmy();
?>
11、parent::子类调用父类方法

重写父类方法中,为了减少与父类方法中相同的冗余代码的产生,因此,可以通过parent::父类方法在子类方法中调用父类方法

<?php
class Person{
	function __construct($name,$age,$address){
		$this->name=$name;
		$this->age=$age;
		$this->address=$address;
	}

	var $name;
	var $age;
	var $address;

	function callname(){
		echo "my name is {$this->name}";
	}

	function gotoArmy(){
		echo "when he was {$this->age} years old,{$this->name} deside goto army from {$this->address}";
	}

}

class Student extends Person{
	var $grade;
	var $major;

	function __construct($name,$age,$address,$grade,$major){
		$this->name=$name;
		$this->age=$age;
		$this->address=$address;
		$this->grade=$grade;
		$this->major=$major;
	}

	function study(){
		echo "{$this->name} is study with {$this->major}";
	}

	function gotoArmy(){
		parent::gotoArmy();
		echo "<br>";
		parent::callname();
		echo "<br>";
		echo "graduted from {$this->major}, {$this->name} deside to be a solider";
	}
}

$xiaomin=new Person("lisi",34,"hainan");
$xiaomin->gotoArmy();
echo "<br>";

$xiaozhang=new Student("zhaoliu",43,"wuhan","senior","news");
$xiaozhang->name="wanger";
echo $xiaozhang->name;
echo "<br>";
echo $xiaozhang->major;
echo "<br>";
echo $xiaozhang->study();
echo "<br>";
echo $xiaozhang->gotoArmy();
?>
12、常见的关键字和魔术方法

关键字有final,static,const
魔术方法有:__call()、__toString()、__autoLoad()

1、final关键字

  • fianl标识的类不能被继承
  • 在类中使用final标识的成员方法,在子类中不能被覆盖

2、static关键字

  • 静态关键字可以将类中的成员标识成静态的,包括静态属性和静态方法
  • 通过类名来方位,使用双冒号
    类名::静态成员属性名
    类名::静态成员方法名
  • 在类声明的成员方法中,也可以使用self来方位其他静态成员。静态成员属于类而非对象实例的,因此不能使用$this来访问。
    self::静态成员属性名
    self::静态成员方法名
  • 在类的外部使用静态成员,可以使用实例形式也可以使用类形式,但通常使用类名访问。
<?php
class Person{
	function __construct($age,$address){
		$this->age=$age;
		$this->address=$address;
	}

	static $name;
	var $age;
	var $address;

	function callname(){
		echo "my name is ".self::$name ;
	}

	static function gotoArmy(){
		echo self::$name." deside goto army from fujian ";
	}

}

$p1=new Person(34, "beijing");
Person::$name="lisi";
$p1->callname();
echo "<br>";
Person::gotoArmy();
?>
13、单态设计模式(单例模式)

实际上只要设计出一个类只有一个实例,也就是使用静态方法和静态成员

class DB{
	private static $obj=null;
	//构造函数构造为private,是为了在类内部去构造一个对象
	private function __construct(){
		echo "连接数据库成功"."<br>";
	}

	//只有通过这个方法才能返回本类的对象,静态方法,通过类名调用
	static function getInstance(){
		if (is_null(self::$obj)){
			//如果obj成员属性为空,则创建本类的实例给obj
			self::$obj=new self();
		}
		//返回本类的对象
		return self::$obj;
	}

	//执行一条查询语句
	function query($sql){
		echo $sql;
	}

}

//只能使用静态方法getInstance去获取DB类的对象
$db=DB::getInstance();

$db->query("select * from table");
?>
14、const常量关键字

const定义一个常量,常量和静态成员属性很相似,因此也是通过类名及self::访问。
const定义的常量名不用带美元符,并且通常都是大写

15、instanceof关键字

对象 instanceof 类名

$db=DB::getInstance();
echo $db instanceof DB;
16、clone对象关键字

对象1=clone 对象2
为对象创建了一个副本,对象2的修改不会影响到对1

<?php
class Person{
	var $name;
	var $age;
	var $address;

	function sayname(){
		echo "my name is {$this->name}";
	}
}

$p1=new Person();
$p1->name="zhangsan";
$p1->sayname();
$p2=clone $p1;
echo "<br>";
$p2->sayname();
$p1->name="lisi";
echo "<br>";
$p1->sayname();
echo "<br>";
$p2->sayname();
?>

打印:
my name is zhangsan
my name is zhangsan
my name is lisi
my name is zhangsan

clone克隆是添加__clone()魔法方法,

<?php
class Person{
	private $name;
	private $age;
	private $address;

	function __construct($name,$age,$address){
		$this->name=$name;
		$this->age=$age;
		$this->address=$address;
	}

	//魔术方法,在克隆时自动调用
	function __clone(){
		$this->name="我是{$this->name}的副本";
		$this->age=12;
	}

	function sayname(){
		echo "my name is {$this->name},and age is {$this->age}";
	}
}

$p1=new Person("zhangsan",23,"beijing");
$p1->sayname();
$p2=clone $p1;
echo  "<br>";
$p2->sayname();
echo  "<br>";

?>

打印:
my name is zhangsan,and age is 23
my name is 我是zhangsan的副本,and age is 12

17、类中的通用方法–__toString()

__toString()方法一定要有一个字符串作为返回值。

<?php
class Person{
	var $name;

	function __construct($name){
		$this->name=$name;

	}

	//魔术方法,在克隆时自动调用
	function __toString(){
		return $this->name;
	}

}

$p1=new Person("zhangsan");

echo $p1->name;
echo  "<br>";
echo $p1;

?>
18、类中的通用方法–__debugInfo()

和__toString()方法一样,当使用var_dump()输出对象时,加入的__debugInfo()方法可以用来控制要输出的属性和值,因此该方法一定要有数组返回值

<?php
class Person{
	private $prop;
	function __construct($prop){
		$this->prop=$prop;
	}

	function __debugInfo(){
		return ['propSquared'=>$this->prop**2];//返回一个数组,只有一个元素
	}
}

var_dump(new Person(100));

?>

打印:
object(Person)#1 (1) { [“propSquared”]=> int(10000) }

19、类中的通用方法–__call()

当调用的方法不存在时,则默认调用__call()方法
两个参数,
第一个参数是调用的不存在的函数名,
第二个参数是一个数组,即不存在函数的的不确定数目的参数

<?php
class Person{
	function exitsffun(){
		echo "this funcation is exits";
	}

	function __call($functionname,$args){
		echo "你调用的函数".$functionname."及参数";
		echo print_r($args)."不存在";
	}
}

$p1=new Person();
$p1->notexits();
echo "<br>";
$p1->notexits2("zhangsan",23,"address");
echo "<br>";
$p1->exitsffun()
?>
20、serialize()对象串行化(序列化)和unserialize()反串行化

serialize()实际就是讲对象写到文件里进行持久化
一个参数,被序列化的对象
unserialize()将序列化后的结果反序列化为对象

类文件Person.class.php

class Person{
	var $name;
	var $age;
	var $address;

	function __construct($name,$age,$address){
		$this->name=$name;
		$this->age=$age;
		$this->address=$address;
	}

	function sayname(){
		echo "my name is{$this->name},i am {$this->age} years old, i live in {$this->address}";
	}
}

?>

本文件

<?php
require 'Person.class.php';
$p1=new Person("zhangsan",34,"dalian");
//将p1序列化为一个序列化字符串
$mySerilise=serialize($p1);
file_put_contents("file.txt", $mySerilise)

?>

反序列化

<?php
require 'Person.class.php';

$serlizeStr=file_get_contents("file.txt");
$per=unserialize($serlizeStr);
$per->sayname();

?>

打印:
my name iszhangsan,i am 34 years old, i live in dalian

__sleep(),__wakeup()屏蔽特定成员属性

__sleep()需要返回一个数组,数组元素为需要序列化的内容,
__wakeup()在反序列化时自动执行,可以为没有序列化或者已经序列化的成员属性重新赋值。

<?php
class Person{
	var $name;
	var $age;
	var $address;

	function __construct($name,$age,$address){
		$this->name=$name;
		$this->age=$age;
		$this->address=$address;
	}

	function sayname(){
		echo "my name is{$this->name},i am {$this->age} years old, i live in {$this->address}";
	}

	function __sleep(){
		//需要序列化的成员属性作为一个数组返回,要用引号引出函数名
		$arry=array("name","address");//序列化name和address,age被忽略
		return  $arry;
	}

	function __wakeup(){
		$this->age=33;
	}
}

$p1=new Person("zhangsan",23,"beijing");

$serlizeStr=serialize($p1);
echo $serlizeStr;
echo "<br>";
$per=unserialize($serlizeStr);
$per->sayname();

?>
21、abstract抽象类

一个类只要有一个抽象方法就是方法类,因此抽象类也需要使用abstract修饰
抽象类作为子类重载的模板来使用

abstract class Person{
	var $name;
	var $age;
	var $address;

	function __construct($name,$age,$address){
		$this->name=$name;
		$this->age=$age;
		$this->address=$address;
	}

	function sayname(){
		echo "my name is{$this->name},i am {$this->age} years old, i live in {$this->address}";
	}

	abstract function work();

	abstract function study();
}

class Chinese extends Person{
	function work(){
		echo "chinese work hard";
	}

	function study(){
		echo "chinese study with chinese";
	}
}

class Jpanese extends Person{
	function work(){
		echo "jpanese work carefuly";
	}

	function study(){
		echo "jpanese study with jpanese";
	}
}

$c1=new Chinese("zhangsan", 23, "beijing");
$j1=new Jpanese("fuyuanai", 33, "dongjing");

$c1->study();
echo "<br>";
$c1->work();
echo "<br>";
$c1->sayname();
echo "<br>--------------<br>";

$j1->study();
echo "<br>";
$j1->work();
echo "<br>";
$j1->sayname();
echo "<br>";


?>
22、interface接口
  • 同java,php也只支持单继承,因此需要采用接口技术来变相实现多继承
  • 接口中使用const关键字声明为常量的成员属性
  • 所有成员属性都必须具备public的访问权限。
  • 由于接口全部是抽象的,所以不用使用abtract关键字
  • 使用interface声明
  • 接口和抽象类都不可以实例化
  • 可以使用extends继承父接口
  • 需要使用接口中的成员,就需要通过子类实现(implements)接口中的全部抽象方法
  • 如果是使用抽象类去实现接口也需要使用implements
interface 接口名称{
	//常量成员
	//抽象方法
}

案例

<?php
interface one{
	const MYCON="const value";
	function fun1();
	function fun2();
}

interface two extends one{
	function fun3();
	function fun4();
}

abstract class MyAbstract implements one{
	//子类实现接口部分方法
	function fun1(){
		echo "i am son class, i implement the father interface";
	}
}

class FromAbstrace extends MyAbstract{
	function fun1(){
		echo "fun1---- i am son class, i extends from Abstract";
	}
	function fun2(){
		echo "fun2---- i am son class, i extends from Abstract";
	}
}

class MyReal implements  two{
	//子类实现接口全部方法
	function fun1(){
		echo "i implement the first emthod";
	}
	function fun2(){
		echo "i implement the second emthod";
	}
	function fun3(){
		echo "i implement the third emthod";
	}
	function fun4(){
		echo "i implement the fourth emthod";
	}
}

$fa=new FromAbstrace();
$fa->fun1();
echo "<br>";
$fa->fun2();
echo "<br>";

$mr=new MyReal();
$mr->fun1();
echo "<br>";
$mr->fun2();
echo "<br>";
$mr->fun3();
echo "<br>";
$mr->fun4();
echo "<br>";
?>

打印:
fun1---- i am son class, i extends from Abstract
fun2---- i am son class, i extends from Abstract
i implement the first emthod
i implement the second emthod
i implement the third emthod
i implement the fourth emthod

  • implements后面通过逗号实现多接口的实现
class 类名 implements 接口1,接口2...{

}
23、多态性的应用
interface Usb{
	function run();
}

class UsbKey implements Usb{
	function run(){
		echo "usb key is in used";
	}
}

class UsbMouse implements Usb{
	function run(){
		echo "usbMouse  is in used";
	}
}

class UsbKeyboard implements Usb{
	function run(){
		echo "usbKeyboard is in used";
	}
}

class Computer{
	function useUsb($usbmachine){
		$usbmachine->run();

	}
}

$computer1=new Computer();
$computer1->useUsb(new UsbKey());
echo "<br>";
$computer1->useUsb(new UsbMouse());
echo "<br>";
$computer1->useUsb(new UsbKeyboard());
echo "<br>";
?>

dayin:
usb key is in used
usbMouse is in used
usbKeyboard is in used

24、通过trait混入类
  • 用来替代class,具备class所具备的所有特性
  • trait不能被实例化
  • 在类中通过use tarit名来混入到类中
<?php
trait TraitDemo{
	function fun1(){echo "fun1 from trait";}
	function fun2(){echo "fun2 from trait";}
}

class Real{
	use TraitDemo;
}

$obj=new Real();
$obj->fun1();
echo "<br>";
$obj->fun2();
echo "<br>";
?>

打印:
fun1 from trait
fun2 from trait

  • 多个trait冲突是,使用insteadof关键字进行屏蔽和替换
<?php
trait TraitDemo1{
	function fun(){echo "1st fun from trait";}
}
trait TraitDemo2{
	function fun(){echo "2se fun from trait";}
}
class Real{
	use TraitDemo1,TraitDemo2{
		TraitDemo2::fun insteadof TraitDemo1;//使用TraitDemo2的fun方法替代TraitDemo1的方法
	}
}

$obj=new Real();
$obj->fun();

?>

打印:
2se fun from trait

  • 可以进行trait的多层嵌套,使用多次use一层层嵌套
    略,不想写

trait的重点问题

  • trait会覆盖调用类继承的父方法
  • 从基类继承的成员被trait插入的成员锁覆盖。有限顺序为:当前类成员覆盖trait方法,而trait则覆盖了父成员方法
  • trait不能像类一样使用new实例对象
  • 单个trait课有多个triat完成(嵌套)
  • 在单个类中可以use引入多个trait,使用逗号隔开
  • trait支持各类修饰符private,protect等
  • 可以使用insteadof 及as操作符解决trait之间的冲突
  • 使用as语法还可以用来调整方法的访问控制
25、new class匿名类
  • 使用new和类名称来实例化对象
  • 和普通类一样可以使用继承extends,实现implements及使用trait
  • 为了访问外部类protected属性方法,匿名类可以继承此外部类。为了使用外部类的private属性,该属性必须通过构造器传进来
  • 其他同java
<?php
$person=new class{
	function say(){
		echo "我是一个匿名类";
	}
}
?>
<?php


class Outer{
	private $prop=1;
	protected $prop2=2;

	//声明一个受保护的成员方法fun3
	protected function func1(){
		return 3;
	}

	//声明一个外部类的成员方法,在方法中返回内部匿名类对象
	public function func2(){
		//声明和返回匿名类对象
		//通过构造方法将外部的私有成员传入,从而访问外部类的私有属性
		//通过继承外部类,访问外部类的私有属性
		return new class($this->prop) extends Outer{
			private $prop3;//内部类的私有成员
			// 构造方法,传入外部私有属性给内部类的私有成员属性
			public function __construct($prop){
				$this->prop3=$prop;
			}
			//内部类的成员方法,访问不同类中的成员进行运算,返回结果
			public function fun3(){
				return $this->prop2+$this->prop3+$this->func1();
			}
		};
	}
}

echo (new Outer())->func2()->fun3();

?>

打印:
6

26、namesapce命名空间
  • namespace是类class的上级容器,为了解决类容易重名的问题,本质上是一个字符串前缀
    格式:
<?php
namespace 空间名
?>
  • 命名空间如同文件夹,有分支(命名空间子空间)
<?php
namespace broshop\cart;
class Test{}

namespace broshop\order;

class Test{}

$test=new Test();
$cartTest=new broshop\cart\Test();

?>
  • 公共空间中的代码段不属于任何命名空间
27、命名空间中的名称和属于
  • 非限定名称
如:$u=new User()  如同文件名
  • 限定名称
如:$u=new ydma\User()  如同相对路径
  • 完全限定名称
如:$u=new  \ydma\User()   如同绝对路径
28、命名空间中的别名和导入(导入命名空间)
  • 调用命名空间的快捷方式
  • 通过use来实现导入命名空间
  • 通过as来取别名
  • 导入其他名字空间的常量使用use const
  • 导入其他名字空间的函数使用use function
<?php
namespace broshop\cart;
class Test{}

namespace broshop\nce;
use broshop\cart\Test as Myname;

class Test{}

$test=new Myname();

namespace broshop\order;
use broshop\nce\Test;//导入命名空间
//导入命名空间
class Test{}

$test=new Test();
$cartTest=new \broshop\nce\Test();

?>
29、面向对象版图形计算器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值