定义类
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";
}