您的位置:首页 > 编程语言 > PHP开发

php5面向对象入门(三)

2009-07-14 08:05 176 查看
原文作者 刀客羽朋 ,这里重新整理,出处:http://www.cnblogs.com/tograce/category/161526.html

这一部分主要将学习如下几个内容:
_______________________________
static 变量、方法
final类、final方法和常量
abstract类和abstract方法
设计模式之模版模式
______________________________

3.1 static 变量、方法

语法与说明① static关键字用来修饰属性、方法,称这些属性、方法为静态属性、静态方法;
② ③④⑤⑥⑦

⑴ static关键字可以用来修饰变量、方法:
⑵ 不经过实例化,就可以直接使用类中的static的属性和static的方法;
⑶ static的属性,在内存中只有一份,为所有的实例共用。
⑷ 使用self::关键字访问当前类的静态成员。

实例:3.1.1 静态属性共用特性 这个实例牵涉到的相关要点是:
⑶ static的属性,在内存中只有一份,为所有的实例共用。
⑷ 使用self::关键字访问当前类的静态成员。

<?php
//静态属性共用特性
class user{
private static $count=0;//记录所有用户的登陆情况
public function __construct(){
self::$count=self::$count+1;
}
public function getCount(){
return self::$count;
}
public function __destruct(){
self::$count=self::$count-1;
}
}
$user1=new user();
$user2=new user();
$user3=new user();

echo "Now here have ".$user1->getCount()." user";
echo "<br />";
unset($user3);
echo "Now here have ".$user1->getCount()." user";

?>显示结果是:
Now here have 3 user
Now here have 2 user
上面的实例中,设置了一个$count静态属性,程序运行中,多个实例共用同一个静态$count属性

实例:3.1.2 静态属性直接调用 ⑵ static的属性,不需要实例化就可以直接使用,在类还没创建时就可以直接使用,
使用方法是 类名::静态属性名

<?php
//静态属性直接使用
class Math{
public static $pi=3.14;//记录所有用户的登陆情况
}

$r=3;
echo "半径为".$r."的圆面积是".Math::$pi*$r*$r;
echo "<br /><br />";

Math::$pi=3.1415926;//直接修改属性值;

echo "半径为".$r."的圆面积是".Math::$pi*$r*$r;
echo "<br /><br />"
?>

3.1.3 静态方法 ●和static的属性一样,static方法不需要所在的类实例化就可以直接使用
●静态方法调用静态方法 调用一个类中的其它静态方法有两种:
1、直接调用 类名::静态方法名
2、 self::静态方法名

<?php
//静态方法调用
//方法1:直接调用 类名::静态方法名
//方法2、 self::静态方法名
class Math{
public static function Max($num1,$num2){
return $num1>$num2?$num1:$num2;
}
public static function Max3($x,$y,$z){
$x=Math::Max($x,$y);//或者$x=self::Max($x,$y);
$z=Math::Max($x,$z);//或者$x=self::Max($x,$z);
return $z;
}
}

$a=98;
$b=56;
$c=88;

echo "The max number of ".$a." ".$b."and ".$c." is ".Math::Max3($a,$b,$c);
?>记住:self:: 表示当前类的静态成员,与 &this不同,&this 表示当前对象
 
●静态方法调用静态属性 调用一个类中其它静态属性也有两种:和上面一样。
1、直接调用 类名::静态属性名
2、 self::静态属性

●静态方法不能调非用静态属性
不能使用self::调用非静态属性
也不能使用 $this获取非静态属性的值

●静态方法调非用静态方法
不能使用$this调用非静态方法
当一个类的非静态方法被self::调用时,系统会自动为这个方法转化为静态方法

______________________________
3.2 final 类、final方法

语法与说明① final---用于类、方法前;
② final类---不可以被继承;
③ final方法---不可以被覆盖;

实例
3.2.1
final类不能被继承如果我们希望一个类不能被继承,就用final修饰这个类.

<?php
//用final声明一个类不能被继承
final class Math{
public static $pi=3.14;

public function __toString(){
return "这是Math类";
}
}

$math=new Math();
echo $math;

//申明类superMath继承自Math,将出现错误
class superMath extends Math {}

?>
______________________________
3.3 常量

语法与说明① 用const 定义常量,定义了一个常量后,它不能被更改;
② 用 类名::常量名 来调用常量;
③ 书写规则:常量一般用大写字母,几个单词组成的常量,为方便阅读,这立写 MAX_MUNBER

实例

<?php
//用final声明一个类
//用const 定义一个常量
final class Math{
const PI=3.14;

public function __toString(){
return "this is a Math class";
}

public final function theareaof($r){
return self::PI*$r*$r;
}
}

$math=new Math();
echo $math;
echo '<br />';
echo Math::PI;
echo '<br />';
echo "The area of the circular with rido 80 is: ".$math->theareaof(80);

?>
________________________________________________
3.4 abstract类和abstract方法

语法与说明① 用abstract 修饰的类表示这个类是一个抽象类, 用abstract 修饰的方法表示这个方法是一个抽象方法;
② 抽象类不能被实例化;
③ 抽象方法只有声明,没有方法的实现内容;

实例3.4.1 抽象类被子类继承后,其子类可以被实例化

<?php
//定义一个抽象类
//子类通过继承,可以被实例化
abstract class User{
//定义它的__toString方法
public function __toString(){
return get_class($this);
}
}

//实例化这个类会出错
//echo new User();

class NormalUser extends User {}

$a= new NormalUser();
echo "This is the insistance of class ".$a;
?>
单独设置一个抽象类,是没有意义的,只有有了抽象方法,抽象类才有了血肉。

3.4.2 抽象方法
① 抽象方法只有声明,没有方法的实现内容;
② 抽象方法没有 {},而采用 ; 结束;
③ 在一个类中,只要有一个抽象方法,这个类必须被声明为抽象类;
④ 抽象方法在子类中必须被重写。

<?php
//抽象方法
abstract class User{
protected $sal;

//定义抽象方法
abstract function getSal();
abstract function setSal($sal);

//定义它的__toString方法
public function __toString(){
return get_class($this);
}
}

//实例化这个类会出错
//echo new User();

class NormalUser extends User {
//抽象方法在子类中必须被重写。
function getSal(){}
function setSal($sal){}
}

$a= new NormalUser();
echo "This is the insistance of class ".$a;
?>
3.4.2 抽象类继承抽象类
① 抽象类继承另一个抽象类,不用重写其中的抽象方法;
② 抽象类中,不能重写抽象父类的抽象方法;

<?php
//抽象类继承抽象类
abstract class User{
protected $sal;

//定义抽象方法
abstract function getSal();
abstract function setSal($sal);
}

abstract class VipUser extends User {}

?>
________________________________________________
3.5 设计模式——模版模式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: