php虽然是一门学习起来非常简单的语言,但是这门语言也包含了对面向对象编程的支持。尤其是随着php5的发布,php对面向对象的支持有了很大的进步。最近学习了一下php的面向对象编程,不禁感慨,面向对象真的是一种非常优雅的编程,最主要的是真的很难!
学习面向对象,当然首先就要了解什么是类,什么是对象,类和对象有什么关系?类和对象的定义就不在这里赘述了,相信大家对类和对象都有一个基本的认识。还是主要说一下类和对象的关系:类是用于生成对象的模板,而对象是类的实例。如何定义类和实例化对象就不多说了,这都是非常简单的操作。下面简单记录一下面向对象的几部分吧(很多是自己在学习时的理解,有不对的地方请大家批评教育!)。
(1)设置类的属性:大家对类有了基本的认识后就会知道,不同的类具有不同的属性,举个例子就像商品类,商品具有价格属性。定义类的属性其实和定义变量个人看来没有什么太大的区别,比较特别的就是在定义属性时,需要给类的属性一个可见性的关键字,这个可见性的关键字就决定了这个属性什么时候可以被访问。可见性关键字有:public、private、protect,如果使用var来定义,则默认为public。
<?php header("Content-type: text/html; charset=utf-8"); class Product{ public $name="衬衫"; public $price=100; } $product1=new Product(); echo $product1->name; ?>
在上述代码中,首先设置了页面编码格式为utf-8,然后定义了一个Product类,这个有两个属性:name、price,并且这两个属性都是public,运行这段代码将输出“衬衫”。
在php中还有一种动态增加属性的操作,$product1->haha="哈哈",直接用已经实例化的方法访问一个不存在的属性并且赋值的方法动态增加属性,这种动态增加属性有一个很大的缺点就是在用类实例化对象时,无法保证其它对象也有这个属性。
(2)类中使用方法:使用方法就是在类中声明类有可能用到的函数,方法声明和函数声明差不多,在方法声明时需要在方法的前面加上一个可见性的关键字,因为可见性关键字的限制,使得方法可以在不同的地方被访问。在类中声明了方法以后,我们可以直接实例化一个对象,然后用对象去访问这个方法即可。
<?php header("Content-type: text/html; charset=utf-8"); class Product{ public $name="衬衫"; public $price=100; public function say(){ return $this->price; } } $product1=new Product(); echo $product1->name."<br>"; echo $product1->say(); ?>
上述代码执行后将会在浏览器输出:“衬衫”,下一行“100”。其实$this是一个伪变量,表示当前对象,注意,表示的是当前对象,而不是类。
在类的方法中一个比较重要的方法就是构造函数(也叫作构造方法),构造方法的作用就是在创建对象时被自动调用,用于对象的实例化。在php5后,推行的构造函数的命名为__construct(),当我们使用new操作符实例化对象时,构造方法被自动调用,根据参数去实例化类中的属性,达到对对象的初始化。(其实个人觉得这种构造方法,只是提供一个自动调用机制,当我们在初始化时,自动调用构造函数,并且传入参数,根据传入的参数初始化类中成员属性)
<?php header("Content-type: text/html; charset=utf-8"); class Product{ public $name; public $price; public function __construct($name,$price){ $this->name=$name; $this->price=$price; } public function say(){ return $this->price; } } $product1=new Product("衬衫",100); echo $product1->name."<br>"; echo $product1->say()."<br>"; $product2=new Product("牛仔裤",200); echo $product2->say(); ?>
上述代码执行后会在浏览器中输出“衬衫、100、200”。
(3)继承:继承是从一个基类得到一个或者多个派生类的机制,子类通过对父类的继承,在获取父类属性和方法的通过,还可以通过“扩展”来扩展自己特有的属性和方法。继承的创建个人认为需要如下步骤,1、从现有基类中分离出不适合放在一起或者需要特殊处理的类方法 2、以我们所分离的为基础创建出派生类,创建子类时需用到关键字extends。 3、因为不同的子类的特有属性肯定不相同,所以我们应该构建子类自己的构造方法和类方法。在构建自己特有的构造函数时,可以使用::来访问父类的构造函数,在自己的构造函数中初始化自己特有的属性。
基类:
<?php class ShopProduct{ //定义私有的属性 private $title; private $producterMainName; private $producterFirstName; private $price; private $$discount=0; //定义构造函数 public function __construct($title,$firstName,$mainName,$price){ $this->title=$title; $this->producterFirstName=$firstName; $this->producterMainName=$mainName; $this->price=$price; } //定义对私有属性进行访问的方法 public function getProducterFirstName(){ return $this->producterFirstName; } public function getProducterMainName(){ return $this->producterMainName; } public function getDiscount(){ return $this->discount; } public function getTitle(){ return $this->title; } public function getPrice(){ return ($this->price-$this->discount); } //定义对私有属性进行操作的方法 public function setDiscount($num){ $this->discount=$num; } //定义类中的一般方法 public function getProducer(){ return "{$this->producterFirstName}"."{$this->producterMainName}"; } public function getSummaryLine(){ $base="{$this->title}({$this->producterMainName},"; $base.="{$this->producterFirstName})"; return $base; } } ?>
子类:
<?php require_once("phpClassShopProduct.php"); class BookProduct extends ShopProduct{ //定义子类特有的私有属性 private $numPages=0; //定义构造函数 public function __construct($title,$firstName,$mainName,$price,$numPages){ parent::__construct($title,$firstName,$mainName,$price); $this->numPages=$numPages; } //定义子类的特有方法 public function getNumOfPages(){ return $this->numPages; } public function getPrice(){ return $this->price; } //覆写父类已有的方法 public function getSummaryLine(){ $base=parent::getSummaryLine(); $base.=":page count-{$this->numPages}"; return $base; } } ?>
从以上代码中,可以看出通过对象的继承写出的代码非常的整洁,有层次。通过继承,大大提高了我们代码的重用性。
自己学习后写的一点东西,记录一下,都是自己的理解,如果哪里有错误,希望大家指出,感激不尽!