学习-php面向对象

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

发表回复