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);
?>