PHP 对象
对象总是有很多话题,面向对象的设计和面向对象的实现。
声明一个类
class User {
// 常量
public const TYPE_COUNTRY = 1;
// 属性
public $name = '';
function getName() {
return $this->name;
}
function setName($newName) {
$this->name = $newName;
}
static function someFunc() {
}
}
$admin = new User;
未定义的属性
如果访问一个未定义的属性,且类中定义了魔术方法 __get() 或 __set(),则这两个方法将优先取得该属性的值或给该属性赋值。
class User {
public function __get($property) {
if ($property == 'QQ') {
$qq = get_qq();
}
return $qq;
}
public function __set($property, $value) {
if ($property == 'QQ') {
set_qq($value);
}
}
static function someFunc() {
}
}
创建对象
$object = new Class;
$admin = new User;
访问对象的属性和方法
使用 ->
符号可以访问对象的属性和方法
$admin->name = "likun";
$admin->setAge(18);
克隆对象
$object = new Class;
$admin = new User;
$admin->name = "likun";
$admin->setAge(18);
$user2 = clone $admin;
继承对象
class Vip extends User {
}
接口
interface interfacename {
}
interface Resizable {
function resize();
}
class WebpImage implements Resizable {
function resize() {
// ...
}
}
trait
trait 是现代语言实现的新机制,它允许不创建父类的情况下,实现 部分复用。
trait Logger {
public function log($logString) {
}
}
抽象方法
abstract class Component {
abstract function Resizable();
}
构造函数和析构函数
当类实例化时,可以在类名后提供参数,这些参数被传递给构造函数。
当对象被销毁时,会调用析构函数,PHP 中,PHP 本身会自行管理和释放资源,因此很少使用到析构函数。
class User {
function __construct($name, $sex) {
$this->name = $name;
$this->age = $age;
}
funciton __destruct() {
echo "Being destroyed."
}
}
$admin = new User("likun","24");
自省
在运行时,可以获得类的信息,而不需要知道类时如何定义的。
这可以写出非常灵活的代码。
序列化
把对象编程字节流就是序列化,这样对象就可以保存到文件中,这对数据的持久化很重要。
反序列化,就是从字节流变回对象。
$encoded = serialize(something);
$something = unserialize(encoded);