PHP常见机制

devtools/2024/10/18 17:41:38/

文章目录

  • 前言
  • 1.魔术方法
  • 2.类型提示
  • 3.闭包和匿名函数
  • 4. Traits
  • 5. 命名空间
  • 6. 序列化与反序列化
  • 7. 反向映射
  • 总结


前言

前面说了反射机制(详见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应用


http://www.ppmy.cn/devtools/125354.html

相关文章

Python网络爬虫技术

Python网络爬虫技术详解 引言 网络爬虫(Web Crawler),又称网络蜘蛛(Web Spider)或网络机器人(Web Robot),是一种按照一定规则自动抓取互联网信息的程序或脚本。它们通过遍历网页链…

JavaEE: HTTPS的魅力与优势揭秘

文章目录 HTTPSHTTPS 是什么HTTPS 基本工作过程Fiddle 等抓包工具,为啥能解析 HTTPS 的数据? HTTPS HTTPS 是什么 HTTPS 是一个应用层协议,是在 HTTP 协议的基础上引入了一个加密层. 几个核心概念: 明文: 要传输的原始数据.密文: 把明文进行加密之后得到一个让别人不能理解…

uniapp学习(003-3 vue3学习 Part.3)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战,开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第21p-第p25的内容 文章目录 双向绑定的实现原理例子 计算属性例子1双向绑定格式改成计算属性 例子2 watchwatc…

Cesium 区域高程图

Cesium 区域高程图 const terrainAnalyse new HeightMapMaterial({viewer,style: {stops: [0, 0.05, 0.5, 1],//颜色梯度设置colors: [green, yellow, blue , red],}});

k8s的pod的管理

常用的Pod基础命令 列出所有命名空间中的所有Pod kubectl get pods --all-namespaces 列出指定命名空间中的所有Pod kubectl get pods -n <namespace> 显示指定Pod的详细信息&#xff0c;包括状态、事件等 kubectl describe pod <pod-name> -n <namespace>…

Django makemigrations时出现TypeError: ‘module‘ object is not iterable

使用Python 3.11、Django 5.1.2 写完model进行makemigrations时出现报错 报错的最下面提到了我自己创建的一个应用里的urls.py&#xff0c;尝试着给里面加上一个列表 然后问题解决了。。。 不知道为什么 makemigrations的时候会去检查urls。。。

【多版本并发控制(MVCC)】

并发事务问题&#xff1a; MySQL隔离级别-未提交读&#xff0c;提交读&#xff0c;可重复读&#xff0c;序列化 隔离级别对于并发事务的解决情况 隔离级别脏读不可重复读幻读未提交读不可不可不可读已提交可不可不可可重复读 &#xff08;默认&#xff09;可可不可串行化&…

es 全文文本分词查询

ES 对 TEXT 类型的分词 我们可以使用分词器来查看分词的结果&#xff0c;默认的分词器是 standard 如果是其他的可以指定分词器 # 标准的分词 POST _analyze {"text": "Hello World!","analyzer": "standard" }全文检索的分词概念 …