Skip to content

定义类

php
<?php

class User {
  // 属性/字段
  public $name;

  // 方法(其实就是函数)
  function __construct($name) {
    $this->name = $name;
  }

  // 实例方法
  function getName() {
    return $this->name;
  }
}

// 实例化
$user = new User('张三');
echo $user->getName(); // 张三

静态属性/方法

php
<?php
class User {
  // 静态方法
  static function getInst() {
    return User::getInst();
  }

  // 静态属性
  static $staticProps = '静态属性';
}

// 使用静态方法 & 属性
$user2 = User::getInst();
echo User::$staticProps;

instanceof 运算符

判断一个对象是否是一个由一个类构造出来的, 或者反过来说: 判断一个对象是否是一个类的实例

php
<?php

class Animal {}
class Person {}

$p1 = new Person();
$a1 = new Animal();

if ($p1 instanceof Person) {
  echo "p1 是 Person 类的实例";
}

if ($a1 instanceof Animal) {
  echo "a1 是 Animal 类的实例";
}

if (!($a1 instanceof Person)) {
  echo "a1 不是 Person 类的实例";
}

继承

php 和 java 一样只能单继承

php
<?php

class GrandPa {
  function f1(){
    echo "GrandPa";
  }
}

class Dad extends GrandPa {
  function f2(){
    echo "Dad";
  }
}

class Son extends Dad {
  function f3(){
    echo "son";
  }
}

$son = new Son();

$son->f1(); // GrandPa
$son->f2(); // Dad
$son->f3(); // Son

重载 与 final

重载也叫 "重写"

php
<?php
class GrandPa {
  function f1(){
    echo "GrandPa";
  }
}

class Dad extends GrandPa {
  function f2(){
    echo "Dad";
  }
  final function f4(){
    echo "final-f4"; // 可以继承, 但是不允许重写
  }
}

class Son extends Dad {
  function f2() {
    echo "son-f2"; // 将会覆盖 Dad::f2()
  }
  function f3(){
    echo "son";
  }
  // function f4(){} // 一旦重写就会报错
}

$son = new Son();

$son->f1(); // GrandPa
$son->f2(); // son-f1
$son->f3(); // Son
$son->f4(); // final-f4

匿名类

PHP 7 引入了匿名类,可以在不定义具体类名的情况下创建类的实例。

php
<?php
// 基本匿名类
$logger = new class {
  public function log($message) {
    echo "Log: $message\n";
  }
};

$logger->log("Application started");

// 实现接口的匿名类
interface LoggerInterface {
  public function log($message);
}

$userService = new class implements LoggerInterface {
  public function log($message) {
    file_put_contents('app.log', date('Y-m-d H:i:s') . " - $message\n", FILE_APPEND);
  }

  public function registerUser($username) {
    $this->log("User registered: $username");
    // 注册用户逻辑
    return true;
  }
};

$userService->registerUser("张三");

// 继承的匿名类
class BaseLogger {
  protected $prefix = "LOG";

  public function formatMessage($message) {
    return "[$this->prefix] $message";
  }
}

$debugLogger = new class extends BaseLogger {
  protected $prefix = "DEBUG";

  public function debug($message) {
    echo $this->formatMessage($message) . "\n";
  }
};

$debugLogger->debug("Debug message");

// 作为方法参数的匿名类
function createLogger($level) {
  return new class($level) {
    private $level;

    public function __construct($level) {
      $this->level = $level;
    }

    public function log($message) {
      echo "[" . strtoupper($this->level) . "] $message\n";
    }
  };
}

$infoLogger = createLogger('info');
$infoLogger->log("Information message");

$errorLogger = createLogger('error');
$errorLogger->log("Error message");

// 闭包与匿名类结合
$multiplier = 2;
$calculator = new class($multiplier) {
  private $factor;

  public function __construct($factor) {
    $this->factor = $factor;
  }

  public function multiply($number) {
    return $number * $this->factor;
  }
};

echo $calculator->multiply(5); // 10

类型声明与返回类型

PHP 7+ 支持参数类型声明和返回类型声明,增强代码的可读性和健壮性。

php
<?php
// 参数类型声明
class Calculator {
  // 基本类型声明
  public function add(int $a, int $b): int {
    return $a + $b;
  }

  // 对象类型声明
  public function saveUser(User $user): bool {
    // 保存用户逻辑
    return true;
  }

  // 数组类型声明
  public function sumArray(array $numbers): float {
    return array_sum($numbers);
  }

  // 可为null的类型声明 (PHP 7.1+)
  public function process(?string $input): ?string {
    if ($input === null) {
      return null;
    }
    return strtoupper($input);
  }

  // 联合类型 (PHP 8.0+)
  public function formatValue(int|string $value): string {
    if (is_int($value)) {
      return "Number: $value";
    }
    return "String: $value";
  }

  // 静态返回类型
  public function create(): static {
    return new static();
  }

  // void返回类型 (PHP 7.1+)
  public function log(string $message): void {
    file_put_contents('log.txt', $message . PHP_EOL, FILE_APPEND);
    // 不能返回任何值,甚至不能返回null
  }

  // 无返回类型声明
  public function getConfig() {
    return [
      'debug' => true,
      'env' => 'development'
    ];
  }
}

// 严格的类型检查 (PHP 7.0+)
declare(strict_types=1);

// 在strict模式下,类型必须精确匹配
$calc = new Calculator();
echo $calc->add(5, 10); // 15
// echo $calc->add("5", "10"); // 会抛出TypeError异常

// 类型声明示例
interface RepositoryInterface {
  public function find(int $id): ?object; // 返回对象或null
  public function findAll(): array;
  public function save(object $entity): bool;
}

class UserRepository implements RepositoryInterface {
  public function find(int $id): ?object {
    // 查找用户逻辑
    if ($id === 1) {
      return (object)['id' => 1, 'name' => '张三'];
    }
    return null;
  }

  public function findAll(): array {
    return [
      (object)['id' => 1, 'name' => '张三'],
      (object)['id' => 2, 'name' => '李四']
    ];
  }

  public function save(object $entity): bool {
    // 保存逻辑
    return true;
  }
}

$repo = new UserRepository();
$user = $repo->find(1);
if ($user) {
  echo $user->name; // 张三
}

// 遍历所有用户
foreach ($repo->findAll() as $user) {
  echo $user->name . "\n";
}

Released under the MIT License.