PHP常见机制

文章目录


前言

前面说了反射机制(详见https://blog.csdn.net/weixin_42695345/article/details/142766219)除了反射,PHP中还有一些其他机制和功能可以在运行时检查和操作对象、类、函数等


1.魔术方法

魔术方法是以双下划线开头的特殊方法,可以在特定情况下自动调用,这些方法提供了对对象行为的控制

php 复制代码
// 示例:
__get():访问不存在或不可访问的属性时调用
__set():设置不可访问或不存在的属性时调用
__call():调用不存在的方法时调用
php 复制代码
class MagicExample {
    private $data = [];

    public function __get($name) {
        return $this->data[$name] ?? null;
    }

    public function __set($name, $value) {
        $this->data[$name] = $value;
    }
}

$example = new MagicExample();
$example->name = "John"; // 触发 __set()
echo $example->name; // 触发 __get()

2.类型提示

PHP支持类型提示,允许在函数或方法中指定参数和返回值的类型,这有助于进行基本的类型检查

php 复制代码
function sum(int $a, int $b): int 
{
    return $a + $b;
}

echo sum(1, 2); // 正确
// echo sum(1, "2"); // 会抛出类型错误

3.闭包和匿名函数

PHP支持闭包(匿名函数),可以在运行时创建函数,并在其中捕获外部变量,闭包可以用作回调或创建动态的可重用代码

php 复制代码
$closure = function($name) {
    return "Hello, $name!";
};

echo $closure("World"); // 输出 "Hello, World!"

4. Traits

Traits是PHP中一种代码复用机制,允许你在多个类之间共享方法,Traits提供了一种避免单继承局限性的方法

php 复制代码
trait Hello {
    public function sayHello() {
        echo "Hello!";
    }
}

class Greeting {
    use Hello; // 使用 Trait
}

$greeting = new Greeting();
$greeting->sayHello(); // 输出 "Hello!"

5. 命名空间

命名空间可以帮助组织代码,避免名称冲突,虽然不是直接的反射机制,但它提供了代码的逻辑结构和更好的可维护性

php 复制代码
namespace MyApp;

class MyClass {
    public function myMethod() {
        echo "Hello from MyClass!";
    }
}

// 使用命名空间实例化
$instance = new \MyApp\MyClass();
$instance->myMethod();

6. 序列化与反序列化

PHP的序列化和反序列化功能可以将对象转换为字符串格式并存储,然后再将其恢复为对象,这在数据持久化和存储中非常有用

php 复制代码
class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

$user = new User("John");
$serialized = serialize($user); // 序列化
$unserialized = unserialize($serialized); // 反序列化
echo $unserialized->name; // 输出 "John"

7. 反向映射

虽然不如反射直接,但你可以使用 get_class_methods(), get_class_vars(), 和 get_object_vars() 等函数来获取类的方法和属性等信息

php 复制代码
class Sample {
    public $foo;
    private $bar;

    public function methodOne() {}
}

$methods = get_class_methods('Sample');
$properties = get_class_vars('Sample');

print_r($methods);//方法
print_r($properties);//属性

总结

这些机制和功能可以与反射结合使用,以实现更强大的功能和灵活性,在实际开发中我没可以根据需求选择合适的工具来设计和维护PHP应用

相关推荐
艾莉丝努力练剑1 小时前
【LeetCode&数据结构】单链表的应用——反转链表问题、链表的中间节点问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表
倔强青铜35 小时前
苦练Python第18天:Python异常处理锦囊
开发语言·python
u_topian5 小时前
【个人笔记】Qt使用的一些易错问题
开发语言·笔记·qt
珊瑚里的鱼6 小时前
LeetCode 692题解 | 前K个高频单词
开发语言·c++·算法·leetcode·职场和发展·学习方法
AI+程序员在路上6 小时前
QTextCodec的功能及其在Qt5及Qt6中的演变
开发语言·c++·qt
xingshanchang6 小时前
Matlab的命令行窗口内容的记录-利用diary记录日志/保存命令窗口输出
开发语言·matlab
Risehuxyc6 小时前
C++卸载了会影响电脑正常使用吗?解析C++运行库的作用与卸载后果
开发语言·c++
AI视觉网奇6 小时前
git 访问 github
运维·开发语言·docker
不知道叫什么呀6 小时前
【C】vector和array的区别
java·c语言·开发语言·aigc
liulilittle7 小时前
.NET ExpandoObject 技术原理解析
开发语言·网络·windows·c#·.net·net·动态编程