【学习笔记】PHP面向对象思想(一)

一、对象的认识

1.对象的形

  类由属性和方法构成,同一类的不同对象区别于属性。对象是属性的集合。

·对象的序列化(把保存在内存中的对象属性保存起来),反序列化(还原)

class person{
    public $name;
    public $age;

    public function say(){
        echo $this->name.'is'.$this->age;
    }
}
$student = new person(); $student->name = tom; $student->age = 10; //序列化 $str = serialize($student); File_put_contents('store.txt',$str); //反序列化 $str = file_get_contents('store.txt'); $student = unserialize($str);

2.对象的本

  对象在底层存储为“属性数组”和“类指针”,即保存了对象属性和类入口

3.对象与数组:对象和数组在内容上一模一样,区别仅仅在于对象有一个指向类的指针

4.对象与类:对象只是数据,本身不包含方法。对象有一个指针指向一个类。

 

二、魔术方法

  魔术方法在特定情况下可以自动调用,用于实现程序的健壮性,编写时需要return返回。

1. __set和__get方法

  ·set可以设置原类中private修饰的属性变量,或者在设置原类中不存在的变量时可以自动调用set方法,防止直接报错,增强健壮性。

  ·get可以获取原类中private修饰的属性变量,或者在获取原类中不存在的变量时可以自动调用get方法,防止直接报错,增强健壮性。

class Account{
          private $user = 1;
          private $pwd = 2;

          public function __set($name, $value){
                 echo "set $name to $value\r\n";
          }
public function __get($name){ if(!isset($this->$name)){ echo "未设置"; $this->$name = "正在设置默认值"; } return $this->$name; } } $a = new Account(); echo $a->user;//通过get方法获取原类中private的属性变量 $a->name = 5;//原类中并未有name这一属性变量,自动调用set方法,进行提示 echo $a->name; echo $a->big;//原类中并未有big这一属性变量,自动调用 get方法,进行提示

2.__call和__callStatic方法

  当调用一个不能被调用的函数(设置不可见或者不存在)时,call方法就会被自动调用。

3.__tostring方法

      用于echo打印对象。当类中有该方法时,echo打印对象可以自动调用。

      可以自定义打印对象的格式。 

 class Account{
    public function __tostring(){
            return "打印对象";
    }
}

$a = new Account();
echo $a;

 

 

         三、继承和多态

1.类的复用方式

1)类的组合:

  在类A中创建类B的对象,并调用类B的方法解决问题。(其中,类B的对象被当做类A的属性)

2)继承

  在子类中调用父类的属性和方法:

                  子类中通过“parent::父类方法名”来调用父类的方法;

                  子类中通过“parent::父类属性名”来调用父类的属性。

class A{

  public $name = "first";
  static $gender = 10;
  public function __construct(){
      echo "这里是父类",PHP_EOL;  //PHP_EOL是php换行符
  }

  public function say(){
      echo $this->name;
  }
}
class B extends A{   public $name;   static $gender = 12;   public $age;   public function __construct(){    parent::__construct(); //子类中通过“parent::父类方法名”来调用父类的方法     echo "这是子类",PHP_EOL;   }   public function cry(){   echo parent::$gender,PHP_EOL; //子类中通过“parent::父类属性名”来调用父类的属性   echo self::$gender,PHP_EOL; //子类中通过“self::属性名”来调用和父类同名的属性   } } $test = new B(); $test->cry();

  ·其中::还能调用静态方法,不要把这两种情况搞混。

2.继承存在的问题

  继承破坏封装性,是紧耦合的,扩展复杂,还可能违反现实逻辑(固化关系)

  【如何使用继承?】

    ①要精心设计专门用于被继承的类

    ②不是专门用于继承的类要用final修饰符禁止被继承

    ③优先考虑使用组合关系

    ④子类是一种特殊类型,不只是父类的一个角色

    ⑤子类拓展,不是覆盖或者让父类的功能失效

    ⑥底层代码多用组合,顶层代码多用继承

3.多态

  多态指同一类的对象收到相同消息的时候,会得到不同的结果。

  如C++和java可以实现father pf = new son,把派生类对象赋给基类对象,在调用函数时动态改变其指向。但PHP却不可以这样操作。

  PHP本身就是多态的,可以通过判断传入对象所属的不同类来调用同名方法,但PHP又是弱类型语言,也没有对象转型机制。

posted @ 2017-03-11 09:33  米唐糖糖糖  阅读(154)  评论(0编辑  收藏  举报