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

【小白笔记】PHP学习之路 (20) --类的初始化、析构函数与继承

2014-03-31 16:53 525 查看
PHP中类的方法不区分大小写。由于PHP是弱类型,所以不能定义重名的方法。

如果把一个已经创建对象复制给一个变量,这个变量保留的是对这个对象的引用,而不是生成一个一样的新对象。

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__仍然表示前一个文件所在路径。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息