这几天学习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


