PHP面向对象基础三

sele关键字

静态成员或者常量的访问是必须使用类名进行访问的,不过为了方便类名的更新,减少开发者维护成本,系统引入了一个类似$this代表对象的方案:self关键字

self关键字是一个在类内部(方法里面)使用,代替类名的写法,能够保障用户方便修改名字

self是用来代替类名的,与范围解析操作符::一起使用的

<?php

use Saler as GlobalSaler;

    class Saler{
        private static $count =0;     //私有属性不能直接访问,只能在类内部访问,而且还是静态属性
        public static function showClass(){
            echo Saler::$count;             //访问静态属性/方法要带$
            echo self::$count;      //用self关键字访问呢静态属性         
        }
    }
    Saler::showClass();     //调用内部静态函数
?>

self 也可以在类内部方便实例化对象:比如构造函数被私有化之后,就没有办法再类外部实例化对象,此时可以在类的内部进行对象实例化

<?php

use Saler as GlobalSaler;

    class Saler{
        private static $count =0;       //私有属性不能直接访问,只能在类内部访问,而且还是静态属性
        public static function showClass(){
            echo Saler::$count;             //访问静态属性/方法要带$
            echo self::$count;      //用self关键字访问呢静态属性         
        }

        //构造方法,私有化
        private function __construct(){}
        
        //静态方法
        public static function getInstance(){
            // return new Saler();
            return new self();      //用self代替类名实例化,只能在类内部使用


        }
    }
    Saler::showClass();     //调用内部静态函数

    // 获取对象
    $s = Saler::getInstance();
    var_dump($s);

?>

总结:

self是一种在类内部用来代替类名的关键字

self可以用来在类内部访问静态成员,属性(类常量也可以)

self也可以在类内部用来实例化对象(代替类名new self)

类的加载

类的访问,本质是因为类的访问必须要保证类在内存中已经存在,所以需要在使用之前将所类所在的PHP文件加载到内存

手动加载

要访问某个类之前,使用文件包含将类所在文件加载进来

<?php
    if(!class_exists('Saler')){    //使用saler,但不去欸的那个内存中是否存在
        //不存在,加载
    include_once "Scler.php";
}
$s = new Saler();
?>

自动加载

PHP中提供了一种加载机制:即实现定义一个函数__autoload();然后当系统需要使用类,而内存中又不存在的时候,系统就会自动调用__autoload()函数,一般编写的时候,类名与文件名同名

<?php
    //自动加载机制:使用系统提供的__autoload()函数
    function __autoload($classname){        //参数为类名,即当前需要访问类的名字
    include_once $classname."xxx.php";        //加载文件名为xxx的类
}

$s = new xxx();        //如果系统发现内存中没有xxx类,那么会自动调用__autoload加载
?>

多文件加载 

<?php
    function c_autoload($classname){
    $c_file='./c'.$calssname.'xxx.php'; 
    if(file_exists($c_file)){
        include_once($c_file);
    }
}
    function d_autoload($classname){
    $d_file='./d'.$calssname.'xxx.php'; 
    if(file_exists($d_file)){
        include_once($d_file);
    }
}

//注册事件
//先尝试调用第一个自定义加载函数,找到了结束,找不到调用第二个加载函数
spl_autoload_register('c_autoload');
spl_autoload_register('d_autoload');
?>

总结:

类 的使用必须保证内存中有该类存在

可以使用手动加载来确保类的安全,优点是明确,缺点是繁琐(类文件名字可以随意,没有规范)

自动加载尽量让类文件名字统一,保证类名和文件名有关联

自动加载可以使用__autoload函数来实现,可以使用自定义函数+ spl_autoload_register()注册共同实现

对象克隆

克隆clone,通过已有对象复制一个新的同样的对象,但两者之间并非同一个对象

<?php
    class Saler{
        public $name;
        private $money =1;
        //克隆方法
        public function __clone(){          //被克隆的对象会调用的方法
            echo __METHOD__.'<br>';
        }
    }
    $a = new Saler;
    $a_1 =clone $a;

    $a_1->naem = 'tom';
    var_dump($a,$a_1);
?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值