PHP面向对象的编程《专题》

一、面向对象的基本概念

    1、什么是面向对象

         

         面向对象 = 对象+ 面向

         对象:世间万物接对象,比如一个人,一本书,一台电脑,一个篮球

         面向:本意就是朝向,在编程的时候心里要有对象。

         面向对象:在编程的时候通过对象的方式,解决实际问题。(对象的方式来存储数据结构)

 

         对象的组成:(1) 对象元素:对应属性  (2) 对象行为:对应方法

         比如一个桌子,四个角、一个平面是属性,移动是桌子表现的行为

         对象的特点:1、独一无二的  2、每个对象都有不同的作用 3、对象可以重复使用。

 

    2、为什么要面向对象

 

         对象的描述方式更加切合生活实际情况,有利于解决大型业务;

         在程序中使用对象,拉近了程序和生活的距离,更加有利于解决实际问题;

 

    3、面向对象的思路

 

          第一步:识别对象  任何一个实体可以做为一个对象

          第二步:识别对象属性  对象组成元素

          第三步:识别对象方法(行为)对象操作自己属性、对象和外部对象交互

 

    4、面向对象的基本原则

 

          对象内部高内聚---每个对象都有特定的职能;对象相关的都封装到对象内部;

           外部低耦合---外部不能看到对象全部属性;外部可以看到对象能做的部分事情(行为);

 

二、面向对象基本实践

    1、类

         物以类聚,把所有相似的对象,归类到一个类中;

         类定义,这些相似对象拥有的相同属性和方法;

         类的实例化,就是生成一个特定的对象。

         类的属性和方法,统称为类的成员。

 

    2、实例化

         通过类创建一个特定的对象。

 

    3、构造函数

          对象实例化的时候动调用,php只能有一个

 

    4、析构函数

          程序执行完成后自动执行,通过把对象设置成null,并且对象不再使用,可以触发析构函数的调用,通       常被用于清理程序资源。

 

    5、对象引用


         

         对象的引用用于访问对象的熟悉和方法,james,james1,james2,三个都是对象的引用。  

         james,james1是两个对立的引用,都指向同一个对象。(=)

         james2是james的影子,指向同一个对象。两者只要任何一个赋值为null,就会删除引用。

    示例代码

//第一个类,NBA球员(统称)
class NBApalyer{
	public $name;
	public $age;
	public $sex;
	
	function __construct($name, $age, $sex){
		$this->name = $name;
		$this->age = $age;
		$this->sex = $sex;
	}
	function run(){
		echo $this->name."run...<br>";
	}
	
	function jump(){
		echo $this->name."run...<br>";
	}
	
	function fly(){
		echo $this->name."run...<br>";
	}
	function __destruct(){
		echo "destory destruct ".$this->name."<br>";
	}
	
}
header("Content-type:text/html;charset=utf-8");
//实例化 kobe
//$kobe = new NBApalyer();
//$kobe->name = "科比";
//$kobe->age = 39;
//$kobe->sex = "male";

//构造函数
$joker = new NBApalyer("教科", 26, "female");
$joker->run();

//这种没有触发析构函数,因为对象还在被joker1使用
//$joker1 = $joker;
//$joker = null; //触发析构函数执行,当对象不再被使用的时候

//这种,只要有一个为null,就执行析构函数。

$joker2 = &$joker;
$joker = null;//$joker2 = null;

echo "program is over<br>";

 

三、面向对象高级实践

    1、继承

         好处:父类中定义的属性和方法,不用再子类中重复定义。

         同一个父类的子类拥有相同的属性和方法,外部可以使用相同的调用方式。

        子类可以调整或修饰父类定义的成员

 

    2、访问控制

         public:公共的,任何地方都可以访问

         private:私有的,只能在本类访问

         protected:受保护的,只能在子类或本类访问

    3、static关键字

         修饰属性和方法,

         1、静态属性只能在静态方法中访问,静态方法只能访问静属性。(self)

         2、类的多个实例化对象,只要一个对象修改了,静态属性,其它对象一并修改。(共享)

         3、 静态属性和静态方法可以直接访问

 

    4、重写

          重写父类的方法

 

    5、final关键字

         修饰类、方法,不能被继承和重写

 

    6、接口

          只能定义没有实现的方法

 

    7、多态

          一个接口可以有很多个实现类,这些实现类的展现,就属于类的多态。

 

    8、抽象

          可以定义没有实现的方法,也可以定义实现的方法

 

    示例代码

<?php
class Base{
	public $name="base name";
	public $age;
	
	function week(){
		echo "base week...<br>";
	}
	//子类不能重写
	final function dispaly(){
	}
}
class Child extends Base{
	public $sex;
	public static $table = "桌子";
	public $name="child name";
	function jump(){
		echo "jump...".$this->name."<br>";
	}
	//静态属性只能在静态方法中访问,静态方法只能访问静属性。通过self访问
	public static function sleep(){
		echo self::$table."<br>";
	}
	//重写父类方法
	function week(){
		echo "child week...<br>";
	}
}
header("Content-type:text/html;charset=utf-8");
//继承
$c = new Child();
$c->jump();
$c->week();

$c2 = new Child();
Child::$table = "椅子";
Child::sleep();

 

四、面向对象魔术方法

    1、 __construct(),__destruct()

 

    2、__toString()

         当对象当做string使用,这个方法自动调用。 echo $object;如果没有这个方法像这样使用会报错

 

    3、__invoke()

         当对象当做方法调用的时候,这个方法自动调用。$objet(4);如果没有这个方法像这样使用会报错。        php5.3新增

 

    4、__call(),__callStatic()

         __call(),当对象访问不存在的方法的时候调用。

         __callStaic(),对象访问不存在的静态方法的时候调用。

         这两个方法在php中,被称为重载(overloading)区别重写(overwrite),调用不存在没有这两个方法就会报错

    5、__get(),__set(),__isset(),__unset()

         __get(),读取不可以访问属性是,调用。(private或不存在)

         __set(),修改不可访问属性的时候,调用。(privateprivate或不存在)

         __isset(),不可访问的属性调用isset() isempty()

         __unset(),不可访问的属性调用unset,改方法调用。

         这四个也被称为四个重载魔术方法。

 

    6、__clone()

         复制一个对象的时候调用该方法,其实就是复制一份对象地址,指向新的对象变量,原对象的修改不会影响复制对象,反之也不会影响。

 

示例代码

<?php
class MagicTest{
	private $name;
	function __toString(){
		return "对象当做string使用时,__toString()自动调用<br>";
	}
	function __invoke($a, $b){
		echo "对象当做方法使用的时候自动调用,$a-$b<br>";
	}
	
	//固定格式[访问函数名称,参数]
	function __call($funcName,$argments){
		echo "调用函数名称:".$funcName.",参数是".implode("-",$argments)."<br>";
	}
	public static function __callStatic($funcName, $argments){
		echo "调用静态函数名称:".$funcName.",参数是".implode("-",$argments)."<br>";
	}
	
	//固定格式
	public function __get($name){
		return "不可访问的属性是:$name<br>";
	}
	public function __set($name, $value) {
		echo "设置不可访问的属性是:$name=$value<br>";
	}
	
	function __isset($name){
		echo 'is isset function '.$name.'<br>';
		return false;
	}
	function __unset($name){
		echo 'is unset function '.$name.'<br>';
	}
}
header("Content-type:text/html;charset=utf-8");
$magic = new MagicTest();
echo $magic;
$magic(1,2);

$magic->callUndefineFunc(1,2,3,4);
$magic::callUndefineStaticFunc(1,2,3);

echo $magic->attrName;
$magic->arrtname = "magic func";

echo "attr is user isset".isset($magic->attr).'<br>';
echo "attr is user empty".empty($magic->attr).'<br>';

unset($magic->attrName);

class CloneClass{
	public $name;
	function __clone(){
		$this->name = "inner clone";
	}
}
$c = new CloneClass();
$c->name = "clone";
$c2 = clone $c;
echo "before call clone name=".$c2->name."<br>";
$c2->name = "clone2";
echo "clone1 name=".$c->name."<br>";
echo "clone2 name=".$c2->name."<br>";








 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值