常用关键词:【$this,__construct(),extends,(public,protected ,private) 】
/**
* $this:指当前对象
* __construct:构造函数,创建对象是执行【初始化对象】
* extends:继承某个类
* public > protected > private (属性和方法权限修饰关键词,权限由大到小排序)
*/
class UserModel extends Model
{
private $user_id;
/**
* 构造函数,创建对象是执行【初始化对象】
*/
public function __construct($user_id)
{
$this->user_id = $user_id;
}
/**
* 析构方法,对象的所有引用都被删除或者当对象被显式销毁时执行
*/
public function __destruct()
{
unlink('server.pid');
}
}
对象实例化【new】:
/**
* new 创建类对象;
*/
$user = new UserModel();
/**
* 在类定义内部,可以用 new self 和 new parent 创建新对象。
*/
class UserModel extends Model
{
public static function getUserModel(){
return new self(); // 创建当前类对象
}
public static function getModel(){
return new parent(); // 创建父类对象
}
}
$class_name = get_class($user); // 获取当前对象所属的类型
关键词【final】:
/**
* 如果父类中的方法被声明为 final,则子类无法覆盖该方法;
* 如果一个类被声明为 final,则不能被继承;
*/
final class Model
{
function __construct(argument)
{
# code...
}
}
关键词【parent::】:
class Service
{
protected $vflag;
protected $data;
public function __construct($vflag=0,$data=[])
{
$this->vflag = $vflag;
$this->data = $data;
}
public function __destruct()
{
}
}
class UserService extends Service
{
private $token;
public function __construct($vflag=0,$data=[],$token='')
{
// 通过 parent:: 来访问被覆盖的方法或属性
// 当扩展父类中某个方法时,不用重复写父类方法部分,执行调用即可,然后再扩展
// 要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()
parent::__construct($vflag=0,$data=[]);
$this->token = $token;
}
public function __destruct(){
// 要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()
parent::__destruct();
}
}
常量定义【const】:
class User
{
// const 常量定义(不要$符号)
const USER_STATUS_OFFLINE = 0;
const USER_STATUS_ONLINE = 1;
const USER_STATUS_PLAYING = 2;
// 常量使用(本类调用):self::USER_STATUS_OFFLINE
// 常量使用(本类外调用):User::USER_STATUS_PLAYING
}
注册自定义载入函数【spl_autoload_register】:
function autoloadProto($class)
{
$file_path = '';
if (strrpos($class, '\\') === false) {
$file_path = trim(BASE_DIR, DS) . DS . 'php' . DS . $class . '.php';
$file_path = str_replace('\\', DS, $file_path);
} elseif (strrpos($class, 'GPBMetadata') !== false) {
$file_path = trim(BASE_DIR, DS) . DS . 'php' . DS . $class . '.php';
$file_path = str_replace('\\', DS, $file_path);
}
include_once $file_path;
}
// 当调用某个未加载类时会触发此函数
spl_autoload_register('autoloadProto');
// 注册静态方法示例:spl_autoload_register(__NAMESPACE__ .'\Foo::test')
序列化/反序列化【serialize 、unserialize 】:
// 序列化一个对象
$user = new User();
$str = serialize($user);
// 反序列化,一般用于序列化后的对象字符串
$user = unserialize($str);
范围解析操作符【::】:
// 范围解析操作符 (::),用于访问静态成员,类常量
class User
{
const USER_STATUS_OFFLINE = 0;
const USER_STATUS_ONLINE = 1;
const USER_STATUS_PLAYING = 2;
// static 关键字定义静态方法和属性
// static 也可用于定义静态变量以及后期静态绑定
private static $map_user_status = [
self::USER_STATUS_OFFLINE => '离线状态',
self::USER_STATUS_ONLINE => '在线状态',
self::USER_STATUS_PLAYING => '游戏中'
];
public function getUserStatusAll(){
return self::$map_user_status;
}
}
魔术方法【__serialize()、__unserialize()】:
class Connection
{
protected $link;
private $dsn, $username, $password;
public function __construct($dsn, $username, $password)
{
$this->dsn = $dsn;
$this->username = $username;
$this->password = $password;
$this->connect();
}
private function connect()
{
$this->link = new PDO($this->dsn, $this->username, $this->password);
}
// 该方法将在任何序列化之前优先执行
public function __serialize(): array
{
return [
'dsn' => $this->dsn,
'user' => $this->username,
'pass' => $this->password,
];
}
// 该方法将在任何反序列化之前优先执行
public function __unserialize(array $data): void
{
$this->dsn = $data['dsn'];
$this->username = $data['user'];
$this->password = $data['pass'];
$this->connect();
}
}
关键词【abstract】:
// 如果类里有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的;
// 抽象类中可以有非抽象方法,抽象类只能被继承,不能实例化;
abstract class Server{
public function output($data=[], $code=0){
$ret['code'] = (int)$code;
$ret['data'] = (array)$data;
echo json_encode($ret, JSON_UNESCAPED_UNICODE);
}
abstract protected function input();
}
class UserServer extends Server{
public function input(){
}
}
$user = new UserServer();
$user->output(['msg'=>'操作成功!']);
关键词:【interface、implements】:
// interface 关键字定义接口,接口用于实现(implements),而非继承和实例化
// (当需要遵循某个协议,同时存在相同部分则使用抽象类;如果仅仅遵循协议则用接口就好了)
interface EncoderInterface
{
public static function encode($bin_string);
public static function decode($encoded_string);
}
abstract class Base64 implements EncoderInterface{
}
重载方法:【__set()、__get()、__isset()、__unset()、__call()、__callStatic()】:
class Phone
{
// 在给不可访问属性赋值时,__set() 会被调用。
public function __set()
{
}
// 读取不可访问属性的值时,__get() 会被调用。
public function __get()
{
}
// 当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
public function __isset()
{
}
// 当对不可访问属性调用 unset() 时,__unset() 会被调用。
public function __unset()
{
}
// 在对象中调用一个不可访问方法时,__call() 会被调用。
public function __call()
{
}
// 在静态上下文中调用一个不可访问静态方法时,__callStatic() 会被调用。
public static function __callStatic()
{
}
}