美文网首页我爱编程
php面向对象——基础

php面向对象——基础

作者: BULL_DEBUG | 来源:发表于2018-04-16 17:28 被阅读12次

    一、 对象和类:

    类与对象的关系就如模具和铸件的关系,类的实力化的结果就是对象,而对对象的抽象就是类,类描述了一组有相同特性(属性)和相同行为的对象。

    1.  class person{ }//这个是类  
    2.  $obj = new person();//类的实例化就是对象
    
    1、类和对象的简单使用
    Class Father {
        public $name; // 这是属性
        
        // 这是方法     
        public function work() {
            echo '<h2>努力工作</h2>';
        }
    }
    $f = new father(); // new 实例对象
    echo $f->name;
    $f->work();
    
    2、$this的使用

    指的是当前对象的意思,在类的内部使用。

    class Father{
        public $name; 
        public function setName($name)  {
            $this->name = $name;
        }
        public function getName()  {
            return $this->name;
        }
    }
    $father= new Father();
    $father->setName("张三");
    $name = $test->getName();
    echo $name; // 张三
    

    二、继承

    1、简单使用
    Class Father {
        public $name; // 这是属性
        // 这是方法     
        public function work() {
            echo '<h2>努力工作</h2>';
        }
    }
    /**
     * 子类继承父类
     */
    Class Son extends Father {
    
    }
    $ming = new Son(); // new 子类的实例对象
    echo $ming->name; // 
    $ming->work(); // 努力工作
    
    2、重写
    Class Father {
        // 属性
        public $name;
        /**
         * 父类中方法
         */
        public function work() {
            echo '<h2>努力工作</h2>';
        }
        /**
         *  重写的时候权限只能放大不能缩小
         *  在子集是可以的
         */
        public function jump() {
            echo '<h2>能跳3米</h2>';
        }
    }
    /**
     * 子类继承父类
     */
    Class Son extends Father {
        /**work
         * 重写父类方法
         */
        public function jump() {
            echo '<h2>能跳5米</h2>';
        }// 改写父类
        public function work() {
            parent::work(); //在父类基础上添加
            echo '<h2>还要谈恋爱</h2>';
        }
    }
    $f = new father();
    $f->work(); // 努力工作
    $f->jump(); // 能跳3米
    //子类的实例对象
    $ming = new Son();
    $ming->work(); //"努力工作/n 还要谈恋爱"
    $ming->jump(); //"能跳5米"
    

    三、修饰符

    public:默认值,表示全局的,类内部外部子类都可以访问。
    protected:表示受保护的,只有本类或子类或父类中可以访问,不允许外部调用。
    private:表示私有的,只有本类内部可以使用。

    1523868465(1).jpg
    <?php
    /**
     * 父类
     */
    Class Father {
        // 属性
        public $name;
        protected $age;
        private $height;
    }
    /**
     * 子类继承父类
     */
    Class Son extends Father {
        /**
         * 完全输出
         */
        public function sonOut() {
            echo '<h2>'.$this->name.' </h2>';// 父亲
            echo '<h2>'.$this->age.' </h2>'; // 49
    //        echo '<h2>'.$this->height.' </h2>'; // 报错
        }
    }
    $f = new father();
    
    echo $f->name.'<br />'; // “父亲”
    //echo $f->age.'<br />'; // 报错
    //echo $f->height.'<br />';// 报错
    
    $ming = new Son();
    $ming->sonOut();
    

    Static:
    (1)静态的属性;
    (2)用static修饰的成员属性可以被同一个类的所有对象共享;
    (3)静态的数据是在类第一次被加载的时候就存在了内存中的数据段中(初始化静态段);
    (4)类中使用self::成员属性名;
    (5)类外 类名::成员属性名;

    Const:
    (1)类中常量属性,在类中声明常量必须使用const;
    (2)类中使用 self::成员属性名;
    (3)类外使用 类名::成员属性名;

    注意:属性中的变量可以初始化,但是初始化的值必须是常数

    (这里的常数是指php脚本在编译阶段时就为常数,而不是在编译阶段之后在运行阶
    段运算出的常数。例如,不能包含任何运算符,不能是任何变量,不能是一个函数等)。

    成员属性的调用方式:
    在类的成员方法里面,可以通过 $this->property(property是属性名字)这种方式来访问类的属性、 方法。但是要访问类的静态属性或者在静态方法里面却不能使用,而是使用 self::$property。
    在类的非静态方法里面可以使用伪变量 $this,这个伪变量是调用该方法的实例化对象引用。

    Class Father {
        static $like = '吃';
        const SEX = '男';
        /**
         * 魔术方法
         */
        public function __construct(){
            echo self::$like;  // 吃
            echo self::SEX; // 男
    //          echo $this->like; //报错
    //          echo $this->SEX;//报错
        }
    }
    

    四、魔法方法

    1.__construct():构造函数,在实例化对象时被调用

    2.__destruct():解析函数。(不常用)

    3.__set():属性重载,在给不可访问属性赋值时,会被调用

    4.__isset():属性重载,当对不可访问属性调用isset()时,会被调用,返回布尔值

    5.__unset():属性重载,当对不可访问属性调用unset()时,会被调用

    6.__clone():克隆

    7.__toString():用于返回一个字符串。只有在直接使用于echo或print时才能生效

    8.__autoload():自动加载类文件

    9.__get():属性重载,在读取不可访问属性的值时,会被调用

    10.__call():方法重载,在对象中调用一个不可访问方法时,__call会被调用

    11.__autoload():没有引入文件时自动加载

    12.__sleep():当对象串行化(serialize()串行化对象)那一瞬间会调用该方法。不能返回父类的私有成员名字。

    13.__wakeup():在反序列化操作(unserialize()反序列化)那一瞬间会调用该方法。

    注意:属性重载只能在对象中进行。在静态方法中,这些魔术方法不会被调用,所以这些方法不能被声明为static。

    eg:

    
    function __autoload($name){
        include_once $name.".class.php";
    }
    $human = new Human();
    echo $human->age."<br>";//18
    
    
    class Student
    {
        public $name,$age;
        function __construct($name,$age){
            $this->name = $name;
            $this->age = $age;
        }
        function __toString()
        {
            // TODO: Implement __toString() method.
           return $this->name."今年".$this->age;
        }
        function __clone()
        {
            // TODO: Implement __clone() method.
        }
        //不存在函数时会调用该方法
        function __call($name, $arguments)
        {
            // TODO: Implement __call() method.
            echo $name."方法不存在"."<br>";
            print_r($arguments);
            echo "<br>";
        }
        function __isset($name)
        {
            // TODO: Implement __isset() method.
            //echo "Is"."&nbsp".$name."&nbsp"."set?";
        return  isset($this->data[$name]);
        }
        //当对象被串行化那一瞬间
        function __sleep()
        {
            // TODO: Implement __sleep() method.
            echo "我要睡着了";
            return array("name","age");
        }
        //当字符串反序列化变回对象那一瞬间调用
        function __wakeup()
        {
            // TODO: Implement __wakeup() method.
            echo "<br>";
            echo "我要醒了";
        }
    }
    
    
    $stu = new Student("张三",18);
    echo $stu."<br>";       //张三今年18
    $stu2 = clone $stu;
    $stu2->name = "李四";
    echo $stu2."<br>";      //李四今年18
    $stu2->show("王五",18);  //show方法不存在   Array ( [0] => 王五 [1] => 18 ) 
    var_dump(isset($stu2->num));  //bool(false)
    echo "<br>";
    //串行化对象
    $str = serialize($stu);   //此时调用sleep函数,输出我要睡着了
    echo "<br>";    
    echo $str;   //O:7:"Student":2:{s:4:"name";s:6:"张三";s:3:"age";i:18;}
    //反序列化字符串
    $strToArr = unserialize($str);   //此时调用wakeup函数,输出我要醒了
    echo "<br>";
    echo $strToArr;            //张三今年18
    

    相关文章

      网友评论

        本文标题:php面向对象——基础

        本文链接:https://www.haomeiwen.com/subject/efrekftx.html