Skip to main content
Version: php

class

class SimpleClass
{
// 声明属性
public $var = 'a default value';

// 类常量
const CONSTANT = 'constant value';

// 声明方法
public function displayVar() {
echo $this->var;
}
}

公有私有

class JustCounter:
__secretCount = 0 # 私有变量
publicCount = 0 # 公开变量

c = JustCounter()
print(c.publicCount)
# print(c.__secretCount) # 报错,实例不能访问私有变量

访问控制

/**
* Define MyClass
*/
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';

function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}

$obj = new MyClass();
echo $obj->public; // 这行能被正常执行
echo $obj->protected; // 这行会产生一个致命错误
echo $obj->private; // 这行也会产生一个致命错误
$obj->printHello(); // 输出 Public、Protected 和 Private

对象继承

class A {
public int $prop;
}
class B extends A {
// Illegal: read-write -> readonly
public readonly int $prop;
}

静态

class Foo {
public static function aStaticMethod() {
// ...
}
}

Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod();

抽象类

PHP 有抽象类和抽象方法

abstract class AbstractClass
{
// 强制要求子类定义这些方法
abstract protected function getValue();
abstract protected function prefixValue($prefix);

// 普通方法(非抽象方法)
public function printOut() {
print $this->getValue() . "\n";
}
}

class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}

public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}

对象接口

使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。

// 声明一个'Template'接口
interface Template
{
public function setVariable($name, $var);
public function getHtml($template);
}


// 实现接口
// 下面的写法是正确的
class WorkingTemplate implements Template
{
private $vars = [];

public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}

public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}

return $template;
}
}

匿名类

匿名类很有用,可以创建一次性的简单对象。

// 使用显性类
class Logger
{
public function log($msg)
{
echo $msg;
}
}

$util->setLogger(new Logger());

// 使用匿名类
$util->setLogger(new class {
public function log($msg)
{
echo $msg;
}
});