zoukankan      html  css  js  c++  java
  • 【学习笔记】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
    ";
              }
    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又是弱类型语言,也没有对象转型机制。

  • 相关阅读:
    ZendFramwork配置
    JS控制页面前进、后退
    PHP乱码
    php 文件和表单内容一起上传
    mysqli常用命令
    图解SQL多表关联查询
    mysql默认字符集修改
    mysql控制台命令
    Nanami's Digital Board

  • 原文地址:https://www.cnblogs.com/sssonia/p/6533984.html
Copyright © 2011-2022 走看看