这几天学习php的面向对象思想,复习一下js的object知识,对学习php的class应该会有一定的帮助,说实话学了两个月的php,再写js代码好别扭的说,变量前总想加一个$,console.log总写成echo -_-!!!
在tutsplus看了这篇讲php面向对象的文章(http://t.cn/RLsi5Dn),说的比那些视频教程要清楚些,看完后觉得和js蛮像的,php的class就相当于js的constructor,类似盖房子前画的蓝图,object就是js里的instance,是根据蓝图盖好的房子本身,像js一样,class里也有properties和methods, class也可以inherit其他的class.那些看起来有些晕的public protected private, ->, magic methods比如说 __construct(),还有 parent::这些,其实都不难,就是看起来有些吓人.ok接下来开始看一些实际的面向对象案例,把刚学到的知识消化掉.
【PHP-面向对象 笔记】
面向对象编程是一种写代码的方式,它允许开发人员使用class把相似的任务归类在一起
1.class 和 object分别是什么?
一个class就像是一栋房子的蓝图,它把设计师的构想画在纸上,然而他并不是一栋真正的房子;
一个object,就像是根据这张蓝图建造出来的房子,object中保存的数据就像是用来建造这栋房子的木材,电线,混凝土…
2.如何创建一个class 和 object?
//使用 class + class名字 来创建一张“蓝图”(class) class MyClass { // Class properties and methods go here } //使用 new+class名字 来根据”蓝图“创建一个真正的”房子“(object),并将其赋给一个变量 $obj = new MyClass;
3.为 class 添加 property
class MyClass { //为 MyClass 添加一个property public $prop1 = "I'm a class property!"; } $obj = new MyClass; //使用 "->" 输出这个 property echo $obj->prop1;
4.为 class 添加 method
class MyClass { //为 MyClass 添加一个 method,用来给 $Prop1赋一个新的值 public function setProperty($newval) { //使用 $this 指代这个class本身 $this->prop1 = $newval; } //为 MyClass 添加另一个 method,来输出 $property 的值 public function getProperty() { return $this->prop1; } } $obj = new MyClass; //调用 setProperty method,给 $prop1赋一个新的值 $obj->setProperty("I'm a new property value!"); //调用 getProperty method,拿到并输出 $prop1的值 echo $obj->getProperty();
5.面向对象中的 Magic methods 是什么
为了让 object 使用起来更方便,php 提供了一些被叫做 Magic method 的特殊 method,和普通method不同的是,当一些动作发生时,他们会被自动激活。
class MyClass { // __construct(),当一个新的 object 被创建出来的时候会被激活 public function __construct() { // __CLASS__ 代表当前 class 的名字 echo 'The class "', __CLASS__, '" was initiated!'; } // __destruct(),当一个object被销毁的时候会被激活 public function __destruct() { echo 'The class "', __CLASS__, '" was destroyed.'; } // __toString(),当直接 echo 一个 object 的时候会被激活,如果没有这个 __toString() magic method,直接将一个 object 以 string 的形式输出会报错 public function __toString() { echo "Using the toString method: "; return $this->getProperty(); } }
6. class 的继承
一个 class 可以从其他的 class 那里“继承” method 和 property,新建另一个 class 时使用 extends + 要继承的class名字 即可
//创建一个class class MyClass { public $prop1 = "I'm a class property!"; } //创建另一个 class,并使用 extends 继承 MyClass class MyOtherClass extends MyClass { public function newMethod() { echo "From a new method in " . __CLASS__ . ". "; } } //创建一个 MyOtherClass 的 object $newobj = new MyOtherClass; //输出一个 MyOtherClass 里并没有的 property,但由于它继承了 MyClass,所以php发现它没有便会再去 MyClass 里找,找到后就会正确显示出来,若还没有才会报错 echo $newobj->prop1;
7.覆写继承过来的 properties 以及 methods
在新的 class 中重新声明一遍一个继承过来的 property 或 method 便可将其覆写。
class MyClass { public $prop1 = "I'm a class property!"; } class MyOtherClass extends MyClass { public $prop1 = "I'm from the new class!"; } $newobj = new MyOtherClass; //由于在MyOtherClass中已经讲 $prop1覆写,所以此时 echo 出的 prop1的结果为"I'm from the new class!" echo $newobj->prop1;
在保留继承下来的原 method 基础上再将其覆写,只需使用 parent:: 后即可
class MyClass { public function __construct() { echo 'The class "', __CLASS__, '" was initiated!'; } } class MyOtherClass extends MyClass { public function __construct() { parent::__construct(); echo "A new constructor in " . __CLASS__ . "."; } } /** *页面上最终显示的信息则会是: *The class "MyClass" was initiated! *A new constructor in MyOtherClass. */
8.为 property 和 method 设置可见性
为了更好的控制每个 property 和 method,他们在声明时需要被赋予可见性,可见性控制着该 property 或 method 从什么范围内能被获取到,
/ public:权限是最大的,可以 class 内部调用,或 object 调用等。 // protected: 受保护类型,用于在当前 class 内或继承的 class 中调用。 // private: 私有类型,只有在当前 class 内部才能调用。 //static: 不需要为 class 声明一个 object 就可以直接使用 class 名字+:: 调用 class MyClass { public static $num = 10; } echo MyClass::$num;
原文链接:http://code.tutsplus.com/tutorials/object-oriented-php-for-beginners–net-12762