PHP学习

PHP中的面向对象

2017-03-08  本文已影响76人  kangyiii

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()强行销毁
上一篇 下一篇

猜你喜欢

热点阅读