【小白笔记】PHP学习之路 (20) --类的初始化、析构函数与继承
2014-03-31 16:53
525 查看
PHP中类的方法不区分大小写。由于PHP是弱类型,所以不能定义重名的方法。
如果把一个已经创建对象复制给一个变量,这个变量保留的是对这个对象的引用,而不是生成一个一样的新对象。
protected只能被当前类和子类访问。为类添加方法时如果不交关键字,默认是public。
结果:
构造函数: __construct() 对象创建时进行初始化。
析构函数: __destruct() 对象被释放时执行的函数。当页面脚本执行完毕时对象自动释放,
或者手动使用unset()函数进行释放。如果其他变量保留了对象的引用,则必须在
对象的引用均删除后才会释放对象。
面向对象编程特性:抽象 封装 继承 多态
抽象: 把一类对的共同属性和方法抽象出来,形成类,这种思考方式就是抽象。
封装:把成员方法和成员属性封装到类中,隐藏属性和方法,隐藏方法实现的细节,通过
public protected private final static 限定类成员的访问权限,数据被保护在内部,
只有通过被授权的成员方法才可以操作。尽可能的对成员进行封装。
继承:可以使一个类继承并拥有另一个已经存在类的成员属性和方法,被继承的类称为父类或基类,继承类为子类。extends 关键字 实现继承关系
多态:子类继承父类,通过对父类方法重写实现多态
类的继承:
结果:
new关键字:通过类创建新对象,类的实例化。
final关键字:规定类不能被继承或类的方法不能被修改或重写。
const关键字:定义类常量,该常量只能在类中访问,类似于define。必须用self关键字访问。
static:声明为类的静态属性或方法。可以不实例化类而直接访问。不能通过一个对象来访问其中的静态成员(静态方法除外)。
self关键字:用于访问类的属性。保存当前类的引用。
$this:用于访问对象的属性和方法。
:: 表示访问类的属性和方法。self::保存当前类的应用,parent::保存父类的引用。如parent::__construct。
结果:
类与对象例:
结果:
另一个例子:
结果:
实际上,__construct()也可以用类名来代替:
结果:
但一般都使用__construct()构造函数来进行初始化,因为这样语义更清晰。并且当修改类名时不必修改构造函数。
一个简单例子:
结果:
魔术常量:返回该常量所在位置的相关属性。
__CLASS__
__METHOD__
__FUNCTION__
__FILE__ 返回所在文件的绝对路径。
__DIR__ 与dirname(__FILE__)一样。但低于PHP5.3版本的无法识别。
DIRECTORY_SEPARATOR 路径分隔符。
例:
如果一个文件中含有__FILE__,后一个文件将其引入,则__FILE__仍然表示前一个文件所在路径。
如果把一个已经创建对象复制给一个变量,这个变量保留的是对这个对象的引用,而不是生成一个一样的新对象。
protected只能被当前类和子类访问。为类添加方法时如果不交关键字,默认是public。
<?php class Person{ public $name; public $age; function __construct($x,$s){ //双下划线 $this->name = $x; $this->age = $s; echo "进行初始化<br/>"; } function sayname(){ echo $this->name."<br/>"; } function sayage(){ echo $this->age; } } $zhangsan = new Person("zhangsan",20); $zhangsan->name = "Lisi"; $zhangsan->sayname(); $zhangsan->sayage(); ?>
结果:
进行初始化 Lisi 20
构造函数: __construct() 对象创建时进行初始化。
析构函数: __destruct() 对象被释放时执行的函数。当页面脚本执行完毕时对象自动释放,
或者手动使用unset()函数进行释放。如果其他变量保留了对象的引用,则必须在
对象的引用均删除后才会释放对象。
面向对象编程特性:抽象 封装 继承 多态
抽象: 把一类对的共同属性和方法抽象出来,形成类,这种思考方式就是抽象。
封装:把成员方法和成员属性封装到类中,隐藏属性和方法,隐藏方法实现的细节,通过
public protected private final static 限定类成员的访问权限,数据被保护在内部,
只有通过被授权的成员方法才可以操作。尽可能的对成员进行封装。
继承:可以使一个类继承并拥有另一个已经存在类的成员属性和方法,被继承的类称为父类或基类,继承类为子类。extends 关键字 实现继承关系
多态:子类继承父类,通过对父类方法重写实现多态
类的继承:
class TV{ public $color; public $brand; function __construct($color,$brand){ $this->color = $color; $this->brand = $brand; echo "完成初始化"."<br/>"; } function watch(){ echo "看电视"."<br/>"; } function __destruct(){ echo "释放对象"."<br/>"; } } class TVsony extends TV{ public $sonyspecial; function watch(){ echo "看电视"."<br/>"; echo "看sony电视"."<br/>"; } } $tv1 = new TVsony("black","brand"); $tv1->watch();
结果:
完成初始化 看电视 看sony电视 释放对象
new关键字:通过类创建新对象,类的实例化。
final关键字:规定类不能被继承或类的方法不能被修改或重写。
const关键字:定义类常量,该常量只能在类中访问,类似于define。必须用self关键字访问。
static:声明为类的静态属性或方法。可以不实例化类而直接访问。不能通过一个对象来访问其中的静态成员(静态方法除外)。
self关键字:用于访问类的属性。保存当前类的引用。
$this:用于访问对象的属性和方法。
:: 表示访问类的属性和方法。self::保存当前类的应用,parent::保存父类的引用。如parent::__construct。
class a{ const s = 0.9; function __construct(){ echo "s:".self::s; } } $b = new a();
结果:
s:0.9
类与对象例:
class Person{ const class_sex = "男"; const class_name = "无名氏"; static $type = 'Person'; private $obj_sex = self::class_sex; //默认值 private $obj_name = self::class_name; //默认值 static function sayClass(){ echo '<br/>类 姓名:'.self::class_name; //类的属性 echo "<br/>类 性别:".self::class_sex; echo "<br/>类型:".self::$type; echo "<br/>-------------------------------"; } function __construct($name, $sex){ //如果构造函数为private,那么只能通过类来进行访问 $this->obj_name = $name; $this->obj_sex = $sex; echo "<br/>初始化<br/> 性别:".$this->obj_sex; echo "<br/> 姓名:".$this->obj_name; echo "<br/>-------------------------------"; } function sayObj(){ echo '<br/>姓名:'.$this->obj_name; //对象的属性 echo "<br/>性别:".$this->obj_sex; echo "<br/>-------------------------------"; } } Person::sayClass(); //Person::sayObj(); //报错 $zhangsan = new Person("张三", "男"); $zhangsan->sayObj();
结果:
类 姓名:无名氏 类 性别:男 类型:Person ------------------------------- 初始化 性别:男 姓名:张三 ------------------------------- 姓名:张三 性别:男 -------------------------------
另一个例子:
class e{ public $uname; static $obj = NULL; private function __construct(){ //只能被内部函数构造 } static function getObj(){ //只能通过访问类本身来调用 if(is_null(self::$obj)){ //单例模式,只能生成1个公用对象 self::$obj = new e(); } return self::$obj; } } $d = e::getObj(); //访问类本身来创建一个实例 $d->uname = 100; echo $d->uname."<br/>"; $e = e::getObj(); //由于类的实例static $obj != null,因此返回$obj的引用 $e->uname = 200; echo $e->uname."<br/>"; echo $d->uname."<br/>";
结果:
100 200 200
实际上,__construct()也可以用类名来代替:
class person{ private $name = 'person'; function person(){ echo $this->name; } } $lisi = new person();
结果:
person
但一般都使用__construct()构造函数来进行初始化,因为这样语义更清晰。并且当修改类名时不必修改构造函数。
一个简单例子:
class A{ function d(){ echo 1111; echo "<br/>"; } function show(){ $this->d(); } } class B extends A{ function d(){ parent::d(); echo 2222; echo "<br/>"; } } $e = new B(); $e->show();
结果:
1111 2222
魔术常量:返回该常量所在位置的相关属性。
__CLASS__
__METHOD__
__FUNCTION__
__FILE__ 返回所在文件的绝对路径。
__DIR__ 与dirname(__FILE__)一样。但低于PHP5.3版本的无法识别。
DIRECTORY_SEPARATOR 路径分隔符。
例:
$path = dirname(__FILE__); define(WEBDIR, $path); define(TEMPLATE, WEBDIR.DIRECTORY_SEPARATOR.'template'); echo TEMPLATE;
如果一个文件中含有__FILE__,后一个文件将其引入,则__FILE__仍然表示前一个文件所在路径。
相关文章推荐
- 【小白笔记】PHP学习之路 (17) --通过回调函数得到数组交集或差集
- 【小白笔记】PHP学习之路 (19) --数组增改排序
- 【小白笔记】PHP学习之路 (11) --数组(1)
- 【小白笔记】PHP学习之路 (12) --数组(2)
- 【小白笔记】PHP学习之路 (31) --cookie和session
- 【小白笔记】PHP学习之路 (32) --session(2)
- 【小白笔记】PHP学习之路 (23) --对象 __set __get 类和对象的检测
- 【小白笔记】PHP学习之路 (29) --图像处理、绘制像素、矩形、多边形
- 【小白笔记】PHP学习之路 (24) --文件处理与目录操作 is_dir mkdir getcwd chdir rmdir
- 【小白笔记】PHP学习之路 (14) --数组(4)
- 【小白笔记】PHP学习之路 (16) --数组(增删、获取元素)
- 【小白笔记】PHP学习之路 (1)
- 【小白笔记】PHP学习之路 (15) --数组(5)
- 【小白笔记】PHP学习之路 (33) --正则表达式
- 【小白笔记】PHP学习之路 (27) --日期、时间戳的获取
- 【小白笔记】PHP学习之路 (2)
- 【小白笔记】PHP学习之路 (30) --绘制文字及相关库函数
- 【小白笔记】PHP学习之路 (13) --数组(3)
- 【小白笔记】PHP学习之路 (7) --函数
- 【小白笔记】PHP学习之路 (10) --字符串(2)