跳到主要内容

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