• 面向对象


    一、

    类:是用于描述“某一些具有共同特征”的物体的概念,是某一类物体的总称。

    通常,一个类所具有的共同特征包括2大方面的信息:

    外观,形状,描述,数据。。。。。属性

    行为,动作,功能。。。。。。。。方法。

    对象:是指一个具体的“物体”,该物体隶属于某个“类别”(类)。

    通常,对象离不开类,没有类,就不能有对象。

    //定义一个类
    class C1{
    //类中有一些属性(就是变量):
    var $name = '匿名';
    var $sex = "未知";
    var $age = 18;
    //类中有一些方法(就是函数)
    function f1(){
    echo "<br />" . $this->name . "在执行函数(方法)f1";//$this就是自己。
    }
    //类中有一些常量(类常量)
    const PI = 3.14;
    }

    //该类创建好之后,只是一个“死代码”(类似一个变量定义好)
    //我们通常需要使用该类才能发挥该类的作用
    //第一个使用就是“创造该类的一个对象”
    $person1 = new C1();//C1是类名,当然如果用Human就更好。
    //此时$person1就是一个“对象”,是有C1这个类所创建出来的对象
    $person2 = new C1();

    $person1->name = "张三"; //给属性赋值(类似给变量赋值)
    $person1->sex = "男"; //同理
    $str1 = $person1->name; //取得属性值(类似取得变量值)
    echo "{$str1}的性别为:" . $person1->sex;
    echo ",年龄为:" . $person1->age;
    $person1->f1();

    $person2 = new C1();

    $CName = "C1";
    $person3 = new $CName(); //可变类(名)

    $person4 = new $person3; //通过对象创建该类的新对象

    二、对象的创建形式

    方式1

    $对象名1  =  new  类名(); //对象名就是变量名;类是应该定义过了

    方式2

    $name =   "C";

    $person = new $name();//可变类(名)

    方式3

    $对象名3 = new  self; //self指代类本身,这行代码只能在类内部方法中使用。

    方式4:通过对象创建对象

    new 对象名;//创建该对象所属类的一个新对象

    三、对象的传值

    值传递: 传递的时候,拷贝的是数据本身。默认都是值传递。

    结果:传递完之后,有了2份同样的数据,但两个变量“相互独立”没有关系。

    引用传递: 传递的时候,拷贝的是引用关系。需要使用“&”才能实现引用传递。

    结果:传递完之后,数据仍然只有一份,但是两个变量共同指向该数据。

    class P{
    var $v1 = 10;
    }
    $p1 = new P(); //也可以写成$p1 = new P;
    $p2 = $p1; //这是值传递
    $p1->v1 = 20; //修改对象$p1
    echo "<br />p1->v1 为:" . $p1->v1;
    echo "<br />p2->v1 为:" . $p2->v1;

    echo "<br />对象p1标识符为:";
    var_dump($p1);
    echo "<br />对象p2标识符为:";
    var_dump($p2);

    unset($p1);
    echo "<br />p1中的v1的值为:" . $p1->v1;
    echo "<br />p2中的v1的值为:" . $p2->v1;

    $p3 = new P();//这个时候才是创建了一个新对象
    //并同时会赋予一个新的标识符
    $p4 = &$p3; //这是引用传递
    echo "<br />对象p3标识符为:";
    var_dump($p3);
    echo "<br />对象p4标识符为:";
    var_dump($p4);



    $p3 = new P(); //再给$p3重新复制
    $p3->v1 = 100; //修改$p3
    echo "<br />p3中的v1的值为:" . $p3->v1;
    echo "<br />p4中的v1的值为:" . $p4->v1;
    echo "<br />对象p3标识符为:";
    var_dump($p3);
    echo "<br />对象p4标识符为:";
    var_dump($p4);

    对象变量进行普通传值的时候,复制的是对象变量中所存储的“对象标识符”

    四、属性

    属性就是放在一个类中的变量。

    定义形式:

    形式1 var  $v1 ; //定义不赋值

    形式2:    var  $v2 = 2; //定义的同时可以赋值,该值只能是“直接值”,常量(值)

    //不能是变量值,也不能是“计算表达式”

    形式3:     public  $v1;

    形式4:     public   $2 = 2; //其实var是“public”一个别名,正式用public更好。

    方法前可以加修饰词:public, protected,private,省略就算public

    五、方法中$this关键字

      

    $this是一个“伪对象”,代表当前所属类的当前对象。

    一个系统函数:get_class(对象) 

    作用:获得某个对象的“所属类名”——结果只是一个类名字符串。

    $class_name = get_class($p1); //结果可能是:”Person”

    静态属性:

    在定义属性的时候,前面加上关键字:static,此时就是静态属性。

    静态属性就是:只隶属于类本身——也可以看做是所有对象的“共有数据”。

    静态属性的使用:

    通过特殊的语法:::(双冒号语法,也叫范围解释符)

    ::$静态属性名

    对比普通属性的使用:

    对象->普通属性名; //普通属性也可以叫做“实例属性”,相应的,对象也叫“实例”

     

    静态方法

    如果在一个方法的前面加上static关键字修饰,则就变成了静态方法。

    静态方法同样隶属于类,而不是隶属于具体对象。使用方法跟静态属性类似:

    类名::静态方法名();

    从理念上,可以认为,静态方法是只隶属于类,而为所有对象所“共有”。

    如果通过类名来调用静态方法,则该方法中不可以出现$this关键字。

    注意1:$this在静态方法中不能使用。

     六、构造方法

    构造方法是“创建”对象的时候会自动调用。

    构造方式是类中的一个“特殊”方法,其作用是在实例化一个对象的同时,给该对象的属性赋值,使之一创建完成,就具有了其本身的特有数据(属性值)。

    1,该方法名字是固定的,为:__construct();

    2,该方法必须是普通方法(不能是静态方法)

    3,通常该方法应该是public

    4,通常该方法中使用$this这个关键字来对属性进行赋值

    5,当new 类名()的时候,其实是在调用该构造方法

    6,如果一个类中定义了构造方法,则实例化该类时就会调用该方法,且实例化时的参数需要跟构造方法的参数匹配

    class P{
    public $name = "匿名";
    public $age = 18;
    //定义一个方法,该方法可以进行“自我介绍”
    function intro(){
    echo "<br />hi,大家好,我叫 " . $this->name;
    echo ",今年 " . $this->age . " 岁";
    }
    function __construct($n, $a){
    $this->name = $n;
    $this->age = $a;
    }
    }
    //$p1 = new P(); //此时这里出错
    //$p1->name = '张三';
    //$p1->age = 20;
    //$p1->intro();
    //上述做法如果可以在创建对象的同时,
    //就给该对象设定其特有的值,就方便了,比如:
    $p2 = new P('李四', 22);//此时可以看作是在调用方法__construct(),对方法进行初始化、赋值
    $p2->intro();

    七、

    析构方法

    析构方法是“销毁”对象的时候会自动调用。

    说明:

    1,析构方法通常不太需要去定义。

    2,析构方法不能调用。

    3,析构方法不能有形参。

    4,析构方法中可以用于清理一些在php代码结束后不能清理的数据,如生成的文件。

    对象销毁的几个情形:

    脚本程序运行结束,自动销毁;

    明确地unset()一个对象变量,则被销毁;

    改变对象变量的值,被销毁;

    实际上,更本质来说,当一个对象(new 出来的对象)没有任何一个变量指向它的时候,该对象就会被自动销毁——自然,如果整个程序结束,也会销毁。

    class P{
    public $v1 = 1;
    function __construct($n){
    $this->v1 = $n;
    echo "<br />被创建了";
    }
    function __destruct(){
    echo "<br />被销毁了";
    }
    }
    echo "<h3>1</h3>";
    $p1 = new P(5);
    $p2 = new P(15);
    $p3 = new P(25);
    unset($p1); //被销毁
    echo "<h3>2</h3>";
    $p2 = 3; //可以等于任意一个数据
    //目的是让$p2原来所指向的对象“没有所属”
    //此时就会发生该原来对象“销毁”情形
    //不过,如果原来有代码$p2a = $p2,
    //则此时又不会销毁该对象

    echo "<h3>3</h3>";

  • 相关阅读:
    IOS中常见的Operation —— NSOperation
    动态语言,别再说不
    CoreImage的使用及常见滤镜工具(一)
    【iOS】用Layer创建一个三维模型以及拖动
    前端基础-html、css
    mysql数据库—索引
    mysql数据库—用户管理、pymysql模块
    mysql数据库—函数、数据备份、流程控制
    mysql数据库基本操作2
    mysql数据库—事务、存储过程
  • 原文地址:https://www.cnblogs.com/loveMis/p/8509784.html
Copyright © 2020-2023  润新知