4月28 继承 ,多态,重载,克隆

复习类和对象
类:由众多对象抽象出来的
对象:通过类实例化出来的
<?php
class Info
{
public $code;
protected $name;
private $sex;
function __construct($s)
{
$this->sex =$s;
}
function Say()
{
echo "hello";
}
function SetSex()
{
return $this->sex;
}
function GetSex($s)
{
$this->sex =$s;
}
function __set($a,$n)
{
$this->$a =$n;
}
function __get($a)
{
return $this->$a;
}
}


//实例化对象
$r =new Info("男");
$r->code ="join";
$r->Say();
//$r->sex; //报错的,因为是面向类的
var_dump($r);

 ?>

 

  继承
相对于父与子的关系,可以联想到人
概念:如果有一个子类那么该子类会继承父类的一切东西 (私有成员访问不到)
做法:要求有父类和子类

在定义子类的时候需要加一个关键字:extends
特点:单继承,一个子类只能有一个父类, 联想到人:儿子只能有一个父亲,但是父亲可以有多个儿子
如果父类中有构造函数,子类在实例化的时候按照父类的构造函数的标准来实例化
parent 代表弗雷,只能在子类中使用,集成的是info,写info也是可以的,但最好不要写不利于维护
final:用来修饰类的,代表该类是一个最终类,该类无法被继承 ,使用时写在父类上面的

<?php
//final class Info
class Info
{
public $code;
protected $name;
private $sex;
function __construct($s)
{
$this->sex =$s;
}
function Say()
{
echo "hello";
}
}
class Test extends Info
{
public $birthday;
function Run()
{
echo "running man";
}
function Say()
{
parent::Say();//父类的也会被调用的
echo "你好"; //直接输出时会被覆盖
}
}
$t = new Test("男");
$t->code = "p001";
//echo $t->sex;//报错了,访问不到
//$t->Run(); //父类中没有的新方法的输出
$t->Say(); //父类中有的方法的输出,不过父类的被覆盖了
var_dump($t);

?>

 

静态成员
普通成员是体现在对象上的
类里面的普通成员是属于对象的,不属于类的(调用的时候是用对象调用)
什么叫做静态的:静态的成员是属于类,不是属于每个对象的
static关键字定义静态的,定义静态成员使用static关键字
静态方法里面不能调用普通成员,不能用$this,而是用self
静态方法可以调用静态成员但是要使用self关键字
self代表该类,$this 代表该对象

<?php
class Info
{
public static $class; //static 静态的
public $code;
protected $name;
private $sex;
static function Test() //调用静态方法
{
echo Info::$class; //调用自身类里面的静态成员
echo "静态方法";
}
function __construct($s)
{
$this->sex =$s;
}
function Say()
{
echo Info::$class; //普通方法里面可以调用静态成员
echo "hello";
}
}
$r =new Info("男");
echo Info::$class ="0305"; //访问静态成员
echo Info::Test(); //静态里面不可以调用普通成员
$r->Say();

//也就是说:静态里面不可以调用普通的,普通方法里面可以调用静态的,静态方法里面可以调用静态成员

?>

 

多态:

多态的概念:当父类引用指向子类实例的时候,由于子类对父类函数进行了重写,导致我们在使用该引用去调用相应的方法表现出的不同

条件:1.必须有继承
2.父类的引用指向子类的实例
3.子类必须要对父类的方法进行重写

<?php
class Ren
{
public $name;
public $sex;
function Say()
{
echo "hello";
}
}
class China extends Ren
{
function Say()
{
echo "你好";
}
}
class America extends Ren
{
{
echo "hi";
}
}

$r = new Ren(); // $r代表Ren类的引用
$r1 = new China(); //$r1代表China类的引用

$r2 =new America();//$r2代表America类的引用

$r->Say(); //hello
$r1->Say(); //你好

$r2->Say();//输出hi


?>

在c#中Ren $r =new Ren();以后用到的所有的$r时就是Ren的类型的,以后的赋值都没有任何的作用
Ren $r = new China();c#中也是可以的,是引用$r指向China的子类
再比如:Ren $r = new America();会像上输出America类里面的一些方法

函数的重载:
关于重载,一般出现在强类型语言中,弱类型语言中不存在,因此这里只是知道有这样的定义,会出现在一些面试的场合。所以条件概念都是必记得内容

假如在php中有重载时:所有以下都是假设存在的
<?php
class Ren
{
public $name;
public $sex;
function Say()
{
echo "hello";
}
function Say($a)
{
echo $a."hello";
}
function Say($a,$b)
{
echo $a.$b."hello";
}
}
$r = new Ren();
$r->Say(); //会根据里面写的参数的个数输出的内容不同

?>
重载实现的条件:1)函数名必须相同(方法名)
2)在函数里面的参数的个数不同(方法名相同的基础上)
3)如果参数的个数相同时,类型不同
eg:function Say(int,$a) 和 function Say(string,$b)
php是弱类型语言所以没有重载:首先php什么类型都可以存储因此类型不同的条件不能满足,
php里面有可变参数的函数,因此参数个数不同这一块很难实现

__tostring()方法的不同于c#中的,在c#中是转换成字符串类型

<?php
class Ren
{
public $name;
public $sex;
function Say()
{
echo "hello";
}
function __tostring()
{
return "这个对象变量包含name和sex,和一个say方法";
}
}

$r =new Ren(); //__tostring用法的输出
echo $r;
?>

对象的克隆:

<?php

class Ren
{
public $name;
public $sex;

function Say()
{
echo "hello";
}

function __clone() //对象克隆的时候自动执行
{
$this->name="李四"; //$this指复本(克隆出来的新对象)
}
}

$r =new Ren();
$r->name = "张三";
$r1=clone $r;
echo $r->name;
echo $r1->name;
var_dump($r1);
?>
克隆对象相当于复制一份交给$r1,在function方法中$this是指新克隆出来的对象

posted @ 2016-04-28 16:34  Durriya  阅读(173)  评论(0编辑  收藏  举报