对象引用赋值
<?php class MagicTest{ public $name; public static $arr=[]; //__tostring会在把对象转换为string的时候自动调用 public function __tostring(){ return "this is the class MagicTest"; } //__invoke会在把对象当作一个方法的时候会自动调用 public function __invoke($x){ return "__invoke called with parameter".$x."\n"; } //方法重载 public function __call($name,$arguments){ echo "Calling ".$name." width parameters: ".implode(',',$arguments).""; } //静态方法重载 public static function __callStatic($name,$arguments){ echo "Static calling ".$name." width parameters: ".implode(',',$arguments).""; } //-------属性重载------ public function __get($name){ return $name; } public function __set($name,$value){ self::$arr[$name]=$value;//如动态设置 } public function __isset($name){ echo "__isset invoked".$name."\n"; } public function __unset($name){ echo "unset property".$name."\n"; } //-------------clone后实例前执行------------------ public function __clone(){ $this->name = "TBD"; } } $obj = new MagicTest(); echo $obj.'\n'; $obj(5); //方法重载 $obj->runTest("para1","para2");//Calling runTest width para... MagicTest::runTest("para1","para2");//Static calling runTest width ... //属性重载 echo $obj->className."\n"; $obj->className = "MagicClassX\n"; echo isset($obj->className) .'\n'; echo empty($obj->className) .'\n'; unset($obj->className); //复制对象实例 $obj2 = clone $obj;//会执行__clone $obj2 ->name = 'obj2';//只改变了obj2,没有改$obj ?>
1、面向对象--继承 extends
子类拥有父类定义的类成员
子类可以修改或调整父类定义的类成员
在子类中,父类的属性也可以通过$this访问
extends后面只能跟一个类名,这就是php的单继承原则,这就是php的单继承原则
2、面向对象--访问控制
public公有的类成员,所有类可以访问
protected受保护的类成员,自身和子类可以访问
private 私有类,类成员只能在类内部访问
3、面向对象-静态成员
1)静态属性定义时在访问控制关键字后面添加static关键字即可
2)静态属性用于保存类的公有数据
3)静态方法里面只能访问静态属性
4)静态成员不需要实例化对象就可以访问
5)类的内部可以通过seft::或者static::关键字访问自身静态成员
6)可以通过parent::关键字访问父类静态成员
7)可以通过类的名称::在类定义外部访问静态成员
4、面向对象--final成员
子类中编写跟父类方法名完全一致的方法可以完成对父类方法的重写overwrite
不想让子类修改方法,在方法添加final关键字
final public function
不想让子类继承类,在类添加final关键字到final class
5、数据访问
1)用parent关键字可以访问父类被子类重写的方法
2)self::可以访问类自身成员方法,也可以用于访问自身静态成员和类常量;不饿能访问类自身的属性;使用常量的时候不需要在常量名称前面添加$符号
3)static关键字用于访问类自身定义的静态成员,访问静态属性时需要在属性前面添加$符号
6、面向对象--接口
1)interface关键字用于定义接口,里面的方法只需定义,不需要具体实现。
interface ICanEat{
}
2)implements 关键字用于便是类实现某个接口
3)实现了某个接口之后,必须提供接口中定义的方法的具体实现
4)不能实例化接口
5)可以用instanceof关键字来判断某个对象是否实现了某个接口,实现了就可以用对象调用方法
6)可以用extends让接口继承接口,当类实现子接口时,父接口定义的方法也需要在这个类里面具体实现
7、面向对象--多态
相同的一行代码,对于传入不同的接口的实现的对象的时候,表现是不同的,这就是多态;这个很重要
function checkEat($obj){
if($obj instanceof ICanEat){
$obj->eat('foo');
}
}
8、面向对象--抽象类
接口里面的方法是没有实现的,而类里面的方法都是有实现的,那么抽象类就是可以包含没有实现的方法,又有实现的方法。
//abstract关键字用于定义抽象类
abstract class ACanEat{
//
abstract public function eat($food);//没有实现
public function breath(){//已实现
echo 'breath';
}
}
//继承抽象类的关键字是extends
class Human extends ACanEat{
//继承抽象类的子类需要实现抽象类中定义的抽象方法
public function eat($food){
//实现
}
}
Human可以用breath和eat方法
对象的基本实践
构造函数function __construct
当对象不会再被使用的时候会触发析构函数function __destruct
析构函数一般用于清理程序使用的资源,比如一个程序用了打印机资源,可以在析构函数释放打印机资源‘
对象引用赋值
$obj = new cls();
$newobj1 = $obj
$newobj2 = &$obj
$obj 、$newobj1、$newobj2 都是对象的引用
$obj、$newobj1是对象的两个独立引用,如果其中一个引用改了对象的属性,另一个引用的属性都改了。如果一个引用设置成了null,则不会影响另外一个引用。
$newobj2是$obj的影子,使用对象的同一个引用,如果其中一个引用改了对象的属性,另一个引用的属性都改了,任何一个赋值为空相当于删除了同一个引用。
对象引用赋值,什么时候调用析构函数
。。。。。。。
,,,,,,
...............
<?php// 类的定义以关键字class开始,后面跟类名,类名通常第一个字母大写class NbaPlayer{ public $name="jordan"; //定义属性 public $height="198cm"; public $team="bull"; public function run(){ //定义方法 echo "running"; } public function shoot(){ echo "shooting"; } }//类到对象的实例化//类的实例化为对象时使用关键字new$jordan = new NbaPlayer();echo $jordan->name;$jordan->run();$jordan->shoot();?>
类的定义属性值是空的,而对象的属性有具体值。
。。。。。。。
抽象类abstract: 介于类和接口之间;抽象类中有部分抽象方法
接口【interface】:就是把不同类的共同行为进行了定义,然后在不同的类里面实现不同的功能
实现:implements
可以用instanceof 关键字判断某个对象是否实现了某个接口
可以用extends实现接口继承接口
当类实现了接口时,父接口定义的方法也需要在这个类里面具体实现
数据访问:
用parent关键字可以访问父类中被子类重写的方法
self关键字可以用于访问类自身的方法,也可以用于访问自身的静态成员和类常量;不能用于访问类自身的属性;使用常量的时候不需要在常量名称前面添加$符号
static关键字用于访问类自身定义的静态成员
final:
不希望子类重写父类的方法
不允许被子类继承
静态成员:static ->用于所有的类的对象公用统一个数据的时候,比如你和我是两个完全独立的人,但是我们统属于华夏子女,那么“中国”就是我们共有的属性,即可以定义为静态成员
声明:static关键字
访问:
在类定义中使用静态成员:self :: 静态成员 或者 static :: 静态成员
在类定义外部访问静态属性,类名 :: 静态成员
子类访问父类的静态成员:parent :: 静态成员
静态方法中不能访问非静态属性