1. 类成员重载
重载 :系统在特定的时机自动调用的方法
__get 触发时机:对象在外部访问私有成员或者受保护属性时调用
该方法有一个参数:参数就是属性名
<?php
class Get
{
public $name;
private $age;
protected $hight;
function __construct($name,$age,$hight){
$this -> name = $name;
$this -> age = $age;
$this -> hight = $hight;
}
public function __get($shuxing){
if ($shuxing == 'age') {
return $this -> age;
}
}
}
$boj = new Get('小明',18,170);
echo $boj -> age;
__set 触发时机:对象在外部设置私有成员或者受保护成员属性值时后调用
需要两个参数,属性名和属性值
<?php
class Set
{
public $name = '小明';
private $age = 18;
protected $hight = 175;
public function __get($shuxing){
if ($shuxing == 'age') {
$this -> age;
}
}
public function __set($name,$val){
var_dump($name, $val);
if ($name == 'age') {
$this -> age = $val;
}
}
}
$boj = new Set();
$boj -> age = 23;
echo $boj -> age;
__tostring 触发时机:echo 一个对象的时候触发,该函数需要return一个字符串
<?php
class SString
{
public $name = '小明';
public function __toString(){
return '我叫'.$this->name;
}
}
$boj = new SString();
echo $boj;
__unset 触发时机:当外部销毁私有属性或者受保护的属性时候触发,
需要传入一个属性名
<?php
class Uset
{
public $name = '小明';
private $age = 18;
protected $hight = 175;
public function __unset($name){
if ($name == 'age') {
unset($this->age);
}
}
}
$boj = new Uset();
unset($boj->age);
var_dump($boj);
__destruct 触发时机:当对象被销毁时候自动调用
<?php
class xigou
{
public $name = '小明';
function Name(){
echo '我叫'.$this->name.'<br>';
}
public function __destruct(){
echo '我被释放了';
}
}
$boj = new xigou();
echo $boj -> Name();
<?php
//serialize 序列化
// __sleep 触发时机:在序列化一个对象时候调用,返回值必须是一个数组,数组中写想要序列化成员属性名
// __wakeup 触发时机:在反序列化一个对象时候调用
//unserialize 反序列化
class Get
{
public $name;
public $age;
public $hight;
function __construct($name,$age,$hight){
$this -> name = $name;
$this -> age = $age;
$this -> hight = $hight;
}
public function __sleep(){
return ['name','age'];
}
public function __wakeup(){
$this -> hight = 180;
}
}
$boj = new Get('小明',18,170);
$str = serialize($boj);
file_put_contents('boj.text',$str);
$str2 = file_get_contents('boj.text');
$obj = unserialize($str2);
var_dump($obj);
<?php
// __call 触发时机:当调用一个不存在对象方法时候触发
// 需要传入两个参数,第一个是函数名,第二个是一个数组
// __callstatic 触发时机:当调用一个不存在静态方法时候触发
class Call
{
public $name = '小明';
public function __toString(){
return '我叫'.$this->name;
}
public function __call($name, $value){
var_dump($name, $value);
}
public static function __callstatic($name, $value){
var_dump($name, $value);
}
}
$boj = new Call();
$boj -> boy(1,2,3);
$boj::dome(1,2,3);
2. 全局成员
<?php
//php全局成员:类,常量,函数
//全局成员特点:一旦定义不能复用
//类
class Dome
{
public $domes = __CLASS__;
}
$obj = new Dome();
echo $obj->domes.'类'.'<br>';
//常量
const NAME = 'admin';
echo NAME.'<br>';
//函数
function dome(){
return __FUNCTION__;
}
echo dome();
3. 空间的声明与空间成员的访问;
<?php
// 空间的声明与空间成员的访问
//命名空间 关键字 namespace
namespace ns{
class Dome
{
public $domes = __CLASS__;
}
$obj = new Dome();
echo Dome::class.'<br>';
//常量
const NAME = 'admin';
echo NAME::class.'<br>';
//函数
function dome(){
return __FUNCTION__;
}
echo dome::class.'<br>';
}
4. 空间成员的分解与合并
合并
dome3.php
<?php
//相同命名空间成员的组织方式
namespace ns;
require 'dome3-1.php';
require 'dome3-2.php';
require 'dome3-3.php';
// 类
echo Demo1::class.'<br>';
// 常量
echo Demo2::class.'<br>';
// 函数
echo Demo3::class;
成员分解
dome3-1.php
<?php
namespace ns;
// 类
class Demo1
{
}
dome3-2.php
namespace ns{
class Demo2
{
// 我有500行代码
}
}
dome3-3.php
<?php
namespace ns{
class Demo3
{
}
}
5. 子空间,并在子空间中访问任何空间中的成员的方式
<?php
namespace ns
{
class dome{
}
echo dome::class,'<br>';
echo ns2\dome::class,'<br>';
echo ns2\ns3\dome::class,'<hr>';
}
//ns子空间
namespace ns\ns2
{
class dome{}
echo ns3\dome::class,'<hr>';
}
//ns2子空间
namespace ns\ns2\ns3
{
class dome{}
//访问上级
echo \ns\ns2\dome::class,'<br>';
echo \dome::class;
}