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

来源:互联网 发布:男朋友 短小 知乎 编辑:程序博客网 时间:2024/06/07 06:23

PHP中类的方法不区分大小写。由于PHP是弱类型,所以不能定义重名的方法。

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

protected只能被当前类和子类访问。为类添加方法时如果不交关键字,默认是public。

<?phpclass 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();?>

结果:

进行初始化Lisi20

构造函数: __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/>";

结果:

100200200

实际上,__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();

结果:

11112222

魔术常量:返回该常量所在位置的相关属性。

__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__仍然表示前一个文件所在路径。


0 0
原创粉丝点击