黑马程序员技术交流社区

标题: 【黑马程序员济南】PHP类和对象的其他相关技术 [打印本页]

作者: 小鲁哥哥    时间: 2017-9-26 14:53
标题: 【黑马程序员济南】PHP类和对象的其他相关技术
本帖最后由 小鲁哥哥 于 2017-9-26 21:18 编辑

类和对象的其他相关技术

类的自动加载:
基本概念:
       当在一个代码中,需要使用一个类(比如new),但此时,在这行代码之前,都没有出现过该类的定义,则php有一种机制,可以让系统这个时候去调用一个函数,在该函数中,我们就可以预先写好加载类的代码——这样就实现了类的自动加载。
       该函数就是:__autoload()
该函数使用形式如下:
       function  __autoload( $class_name ){
              //这里就可以去写加载类的代码,其中:
              //$class_name就代表“正需要”的那个类名;
       }
[PHP] 纯文本查看 复制代码
<?php
/*黑马程序员济南中心出品*/
    function __autoload($class_name){
        //自动去加载对应类名的这个php文件
        require_once "./{$class_name}.class.php";
}

可见,实现这种类的自动加载的方便性,需要做到:
       1,类文件名有一个统一的形式:比如:类名.clsss.php
       2,统一都放在一个文件夹中;
       3,尽可能做到:一个类文件中,只放一个类的定义;

自定义类的加载函数
       使用下述函数,可以人为定义“多个”自动加载函数(这些函数的作用跟__autoload)一样。
使用形式:
       spl_autoload_register(“自动加载函数名1”);
       spl_autoload_register(“自动加载函数名2”);
       。。。。
       然后就可以去定义这些函数了
       在运行的时候,如果需要一个类,就先调用第1个函数去“试图”加载该类,如果在该函数中没有加载成功,就会继续调用下一个函数继续“试图”加载该类,依此类推。。。
举例:
[PHP] 纯文本查看 复制代码
<?php
/*黑马程序员济南中心出品*/

spl_autoload_register("auto1");
spl_autoload_register("auto2");
function auto1($class_name){
echo "<br />进入auto1,需要:$class_name";
$file = "./{$class_name}.class.php";
if(file_exists($file)){
include_one $file;
}
}
function auto2($class_name){
echo "<br />进入auto2,需要:$class_name";
$file = "./{$class_name}.class.php";
if(file_exists($file)){
include_one $file;
}
}

$obj1 = new A();
echo "<br />";
var_dump($obj1);

$obj2 = new B();
echo "<br />";
var_dump($obj2);

展示结果为:
进入auto1,需要:A
object(A)#1 (0) {}
进入auto1,需要:B
进入auto2,需要:B
object(B)#2 (0) {}

对象的复制
       $obj1 = new A();
       $obj2 = $obj1;                //这里,虽然是值传递,但因为对象数据存储的特殊性,并没有复制对象数据本身
       //即,并没有生成一个新对象;
要想复制一个对象——得到一个完完全全的相同的对象,只能这样:
       $obj3  =  clone  $obj1;
[PHP] 纯文本查看 复制代码
<?php
/*黑马程序员济南中心出品*/

class A{
    public $p1 = 1;
}

$obj1 = new A();
$obj2 = $obj1;
$obj3 = clone $obj1;
var_dump($obj1);
var_dump($obj2);
var_dump($obj3);

$obj1->p1 = 11;
var_dump($obj1);
var_dump($obj2);
var_dump($obj3);
展示效果:
object(A)#1 (1) {["p1"]=>int(1)}
object(A)#1 (1) {["p1"]=>int(1)}
object(A)#2 (1) {["p1"]=>int(1)}

object(A)#1 (1) {["p1"]=>int(11)}
object(A)#1 (1) {["p1"]=>int(11)}
object(A)#2 (1) {["p1"]=>int(1)}

可见,普通赋值所得到的对象,仍然是原来的对象;
       只有clone所得到的对象,才是一个全新的对象;
注意:
       1,当对一个对象进行克隆的时候,就会自动调用系统中的__clone()魔术方法(如果有);
       2,因此,对于单例类的需求来说,就应该做到:禁止克隆,写法:
       private  function  __clone(){  }

对象的遍历
       跟数组类似,对象的“所有属性”,也是可以进行遍历的——一个一个取出。
      形式:
              foreach( $对象  as  $prop  =>  $value ){
                     //$prop表示属性名;
                     //$value表示对应的属性值;
              }
注意:
       其实能取到的属性数据,只是在该位置可以访问(有权限访问)到的那些。
[PHP] 纯文本查看 复制代码
<?php
/*黑马程序员济南中心出品*/

class A{
    public $p1 = 1;
    protected $p2 = 2;
    private $p3 = 3;
    static $p4 = 4;
    function showInfo(){
        foreach($this as $prop=>$value){
            echo "属性$prop = $value";
        }
    }
}

$a1 = new A();
foreach($a1 as $prop=>$value){
    echo "属性$prop = $value";
}

$a1->showInfo();
展示效果:
属性p1 = 1;

属性p1 = 1
属性p2 =2
属性p3 = 3

不知道大家对今天讲的类和对象的其他相关技术学习的怎么样啊?有什么疑问欢迎来黑马程序员济南中心来咨询哟~

点进这个帖子的同学肯定是要奋发图强,学技术拿高薪的有志青年,这里我看你骨骼惊奇,是个绝世的练武奇才,你我有缘,今天我就把这个武林秘籍如来神掌传授于你! 什么?不想学如来神掌?不要紧!这里有各个门派的武林绝学,链接拿好!!哈哈哈哈

【黑马程序员济南】小鲁哥哥全学科技术整合帖(一贴在手!天下我有!)







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2