美文网首页PHP学习
PHP中的面向对象

PHP中的面向对象

作者: kangyiii | 来源:发表于2017-03-08 11:31 被阅读76次

    PHP面向对象的语法,面向对象只可意会不可言传,万物皆对象:

    定义类

    1. 定义属性(变量)
    2. 定义方法(函数)
    3. 定义常量(类常量)
    
    定义类

    创建类对象(实例化)

    创建类对象

    使用对象

    Snip20170306_4.png
    1. 使用对象中的属性(变量)
    2. 使用对象中的方法(函数)
    3. 使用对象中的常量(类常量)
    

    对象创建方式:

    //方式0
    $person1 = new C1();
    
    //方式1
    $CName = "C1";
    $person3 = new $CName();
    
    //方式2
    $CName2 = new self;
    
    //方式3
    $person4 = new $person3;
    

    对象传值

    1. 值传递:传递的时候拷贝一份传过去。默认方式。
    2. 引用传递:传递的就是本身,若修改本身也会被修改,需要加“&”。
    与结论相反的结果

    注意:默认方式是指传递,为什么打印结果是引用传递呢?其实确实拷贝出了新对象,但是新对象中的一个内部指针(指向具体指)却是被完全复制下来的,之前指向什么,拷贝内部指针后还会指向它,而这个数字就是内部指针指向的内容,如图:

    Snip20170306_8.png

    类中的方法:

    <?
    class Person{
        public $x = 1;
        public $y = 1;
        public $PI = 3.14;
        
        function getXiebian($a,$b){
            $s1 = $a*$a + $b*$b;
            $s2 = pow($s1,0.5);
            return $s2;
        }
        
    }
    $p1 = new Person();
    $xie1 = $p1->getXiebian(3,4);
    echo "<br/>斜边:".$xie1;
    ?>
    

    方法中$this关键字

    $this是一个“伪对象”,类似于iOS中的self

    <?
    class Person{
        public $name = "匿名";
        public $age = 18;
        
        //自我介绍方法
        function introduce(){
            echo "<br/>我叫".$this->name;
            echo "<br/>年龄".$this->age;
        }
    }
    
    $p2 = new Person();
    $p2->name = "大牛";
    $p2->introduce();
    
    //打印结果:
    //我叫大牛
    //年龄18 
    ?>
    
    //获取某个对象所属的类名。结果只是一个类名字符串
    get_class(对象名)
    

    静态属性

    在定义属性的时候,前面加上关键字:static。作用:一般属性的值隶属于一个类对象,静态属性是所有对象的“共有数据”。下面例子中可以证明:

    <?
        class C2{
            static $v1 = 10;
        }
        C2::$v1 = 100;
        $s1 = C2::$v1;
        echo "<br/>s1 =  $s1";
        //输出结果:s1 = 100
        $c1 = new c2();
        echo "<br/>".$c1::$v1;
        //输出结果:100
        $c1::$v1 = 200;
        $c2 = new c2();
        echo "<br/>".$c2::$v1;
        //输出结果:200
    ?>
    

    静态方法

    在方法名前添加static就变成了静态方法,静态方法属于类,不属于具体对象。使用方法和静态属性类似。

    class S1{
            public $v1 = 1;
            static $v2 = 2;
            static function showInfo(){
                echo "<br/>显示信息";
                //错误写法:不能在静态方法里面调用对象属性,因为静态方法通过类名调用
                //echo "v1 = ".$this->v1;
                echo "v2= ".S1::$v2;
            }
        }
        S1::showInfo();
    

    self

    代表当前类,通常只能在某个类的某个方法内部可以使用,代表该类,
    self和$this的区别:self代表当前类,$this代表当前对象,所以静态方法中可以使用self,但不能使用$this。

    class S2{
            //返回这个类
            static function getInstance(){
                return new self;
            }
        }
        echo "<br/>";
        $obj2 = S2::getInstance();
    

    构造方法

    构造方法是可理解为类的一个特殊方法,其作用是在实例化一个对象的同时,给该对象的属性赋值,使它创建完成后就具有了特定的属性值或者数据。

    1. 该方法名固定:__contruct();
    2. 该方法必须是普通方法(非静态)
    3. 定义构造方法后,创建对象必须以有构造方法的形式来实例化对象
    <?php 
    class P{
                public $name = "匿名";
                public $age = 18;
                function intro(){
                    echo "<br/>名字:".$this->name;
                    echo "<br/>年龄:".$this->age;
                }
                function __construct($n,$a){
                    $this->name = $n;
                    $this->age = $a;
                }
            }
            //普通实例化
            $p1 = new P();
            $p1->name = "大牛弟弟";
            $p1->intro();
            
            //有构造方法的实例化
            $p2 = new P('大牛',12);
            $p2->intro();
            
        ?>      
    

    析构方法

    构造方法在创建对象时自动调用,析构方法在销毁对象时自动调用,通常,php程序结束后,所有对象都会自动销毁(php内部具有垃圾回收机制)

    1. 析构方法通常不需要定义
    2. 析构方法不能手动调用,不能有参数
    3. 析构方法中可以用于清理一些php代码结束后不能清理的数据
    4. 先创建的对象后销毁,栈的概念
    5. 销毁时机:当没有指针指向这个对象时对象就会被销毁,或使用unset()强行销毁

    相关文章

      网友评论

        本文标题:PHP中的面向对象

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