PHP手册整理 - 类与对象

常用关键词:【$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()
    {

    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值