菜鸟初学-php对象的三大特性详解

1、封装 
首先先介绍一个抽象的概念 抽象: 
我们在前面去定义一个类时候,实际上就是把一类事物的共有的属性和行为提取出 来形成一个物理模型(模板)。这种研究问题的方法称为抽象。 那么什么是封装呢? 
封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部 分只有通过被授权的操作(成员方法),才能对数据进行操作。 
上边概念中我标蓝的部分中提到了封装时的数据保护和方法的授权,因此,在彻底了解 封装之前先说一下访问控制修饰符。

public 

 

 

 

 

 

 

 

表示全局,类内部、外部和子类都可以访问;

 

protected 

 

 

 

 

 

 

表示受保护的,只有本类或子类可以访问;

 

private 

 

 

 

 

 

 

 

 

表示私有的,只有本类内部可以使用;

 

 

php

中对象的成员变量的访问属性不能是默认的

public        表示全局,类内部、外部和子类都可以访问;
protected       表示受保护的,只有本类或 子类可以访问;
private         表示私有的,只有本类内部可以使用;
php中对象的成员变量的访问属性不能是默认的  
比如: class Person{ $name=‘abc’; } $p1=new Person();是错误的!!
class Person{  
  public $name;  
public $age;  
private $salary;
  public function Person($name,$age,$salary){    //带参数的函数
$this->name=$name;   
$this->age=$age;  
  $this->salary=$salary;  
}  
public function getSalary(){   
return $this->salary;  
} 
} 
$p1=new Person("某某",10000); 
echo '工资='.$p1->getSalary();

下边我把php的魔术函数给大家介绍一下:  
魔术函数: 
1。__construct()  
实例化对象时被调用,
当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用。  
2。__destruct()  
当删除一个对象或对象操作终止时被调用。  
3。__call()  
对象调用某个方法,  
若方法存在,则直接调用;  
若不存在,则会去调用__call函数。  
4。__get()  
读取一个对象的属性时,  
若属性存在,则直接返回属性值;  若不存在,则会调用__get函数。  
5。__set()  
设置一个对象的属性时,  若属性存在,则直接赋值;  若不存在,则会调用__set函数。  
6。__toString()  
打印一个对象的时被调用。如echo $obj;或print $obj;  
7。__clone()  
克隆对象时被调用。如:$t=new Test();$t1=clone $t;  
8。__sleep()  
serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。  
9。__wakeup()  
unserialize时被调用,做些对象的初始化工作。  
10。__isset()  
检测一个对象的属性是否存在时被调用。如:isset($c->name)。  
11。__unset()  
unset一个对象的属性时被调用。如:unset($c->name)。  
12。__set_state()  
调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。  
13。__autoload()  
实例化一个对象时,如果对应的类不存在,则该方法被调用。
魔术常量: 
1。__LINE__  
返回文件中的当前行号。
2。__FILE__  
返回文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。
3。__FUNCTION__  
返回函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
4。__CLASS__  
返回类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
5。__METHOD__  
返回类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
2、继承 
继承可以解决代码复用,让我们的编程更加靠近人类思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,
所有的子类不需要重新定义这些属性和方法,只需要通过class 子类名 extends 父类名{}这样,子类就会自动拥有父类定义的属性和方法。
方法重写/方法覆盖(override) 
既然子类可以继承父类的属性和方法,这样可以提高代码的复用性,子类可以把父类中继承过来的方法进行重写,便于扩展。 
简单的说:方法重写就是子类有一个方法,和父类的某个方法的名称、参数个数一样,那么我们就说子类的这个方法重写了
提示:
如果在子类中需要访问其父类的方法(public/protected属性),可以使用父类::方法名 或者 parent::方法名 来完成。
<?php 
class parents{ 
public function test(){  
echo "我是父类的方法"; 
}
} 
class child extends parents{ //父类中只有public 、protected子类才可继承 
public function test(){  
echo "我是继承父类的方法,改写后的";  
echo '*******s';
  parent::test(); 
}
} 
$child = new child();
$child->test(); 
//这里输出我是继承父类的方法,改写后的*******s我是父类的方法 
//所以这里的重写覆盖并没有把父类的给覆盖,而是他继承的那个 
?>

关于方法重写细节讨论 
1. 要实现重写,要求 子类的那个方法的名字和参数列表个数一摸一样,但是并不
要求参数的名称一样. 
2. 如果子类要去调用父类的某个方法(public / protected) 则可以使用 parent::方法
名(参数..) , 父类名::方法名(参数...) 
3. 在实现方法覆盖的时候,访问修饰符可以不一样 //但是必须满足: 子类的访
问范围>=父类的访问范围 
3、多态 
 方法重载(overload) 
“重载”是类的多态的一种实现。函数重载指一个标识符被用作多个函数名,且能够通过函数的参数个数或参数类型将这些同名的函数区分开来,调用不发生混淆。调用的时候,虽然方法名字相同,但根据参数表可以自动调用对应的函数。
①用继承实现多态
<?php
/**
* Created by PhpStorm.
* User: Jing
* Date: 2016/7/18
* Time: 9:41
*/
Class father{
    public $name;
    public function getWeight(){
      return "60kg";
    }
    public function getName(){
        $this->name="zhangsan";

    }
}
class son extends father{

    public function  getName()
    {
     echo "我是接口实现的多态,我继承了父类的方法和属性";
    $this->name="lisi";//输出放入lisi是son继承father后改写的
    }
}
$mySon=new son();
$mySon->getName();
echo $mySon->getWeight();
//输出放入lisi是son继承father后改写的
echo $mySon->name;

②用接口实现多态
<?php

interface mum{
    public function getName();
    public function setName();
}
class son implements mum{
    public function getName(){
        return "lisa";
    }
    public function setName(){
       echo "我是接口实现的多态";
        return "duoli";
    }
}
$mySon=new son();
echo $mySon->getName();
echo $mySon->setName();



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值