- PHP 教程
- PHP - 首页
- PHP - 简介
- PHP - 安装
- PHP - 历史
- PHP - 特性
- PHP - 语法
- PHP - Hello World
- PHP - 注释
- PHP - 变量
- PHP - Echo/Print
- PHP - var_dump
- PHP - $ 和 $$ 变量
- PHP - 常量
- PHP - 魔术常量
- PHP - 数据类型
- PHP - 类型转换
- PHP - 类型混杂
- PHP - 字符串
- PHP - 布尔值
- PHP - 整数
- PHP - 文件与 I/O
- PHP - 数学函数
- PHP - Heredoc 和 Nowdoc
- PHP - 复合类型
- PHP - 文件包含
- PHP - 日期和时间
- PHP - 标量类型声明
- PHP - 返回类型声明
- PHP 运算符
- PHP - 运算符
- PHP - 算术运算符
- PHP - 比较运算符
- PHP - 逻辑运算符
- PHP - 赋值运算符
- PHP - 字符串运算符
- PHP - 数组运算符
- PHP - 条件运算符
- PHP - 展开运算符
- PHP - 空值合并运算符
- PHP - 比较运算符(太空船运算符)
- PHP 控制语句
- PHP - 决策语句
- PHP - If…Else 语句
- PHP - Switch 语句
- PHP - 循环类型
- PHP - For 循环
- PHP - Foreach 循环
- PHP - While 循环
- PHP - Do…While 循环
- PHP - Break 语句
- PHP - Continue 语句
- PHP 函数
- PHP - 函数
- PHP - 函数参数
- PHP - 按值传递
- PHP - 按引用传递
- PHP - 默认参数
- PHP - 具名参数
- PHP - 可变参数
- PHP - 返回值
- PHP - 传递函数
- PHP - 递归函数
- PHP - 类型提示
- PHP - 变量作用域
- PHP - 严格类型
- PHP - 匿名函数
- PHP - 箭头函数
- PHP - 可变函数
- PHP - 局部变量
- PHP - 全局变量
- PHP 超全局变量
- PHP - 超全局变量
- PHP - $GLOBALS
- PHP - $_SERVER
- PHP - $_REQUEST
- PHP - $_POST
- PHP - $_GET
- PHP - $_FILES
- PHP - $_ENV
- PHP - $_COOKIE
- PHP - $_SESSION
- PHP 文件处理
- PHP - 文件处理
- PHP - 打开文件
- PHP - 读取文件
- PHP - 写入文件
- PHP - 文件是否存在
- PHP - 下载文件
- PHP - 复制文件
- PHP - 追加文件
- PHP - 删除文件
- PHP - 处理 CSV 文件
- PHP - 文件权限
- PHP - 创建目录
- PHP - 列出文件
- 面向对象的 PHP
- PHP - 面向对象编程
- PHP - 类和对象
- PHP - 构造函数和析构函数
- PHP - 访问修饰符
- PHP - 继承
- PHP - 类常量
- PHP - 抽象类
- PHP - 接口
- PHP - 特性
- PHP - 静态方法
- PHP - 静态属性
- PHP - 命名空间
- PHP - 对象迭代
- PHP - 封装
- PHP - final 关键字
- PHP - 方法重载
- PHP - 克隆对象
- PHP - 匿名类
- PHP Web 开发
- PHP - Web 概念
- PHP - 表单处理
- PHP - 表单验证
- PHP - 表单邮件/URL
- PHP - 完整表单
- PHP - 文件包含
- PHP - GET 和 POST
- PHP - 文件上传
- PHP - Cookie
- PHP - Session
- PHP - Session 选项
- PHP - 发送邮件
- PHP - 净化输入
- PHP - Post-Redirect-Get (PRG)
- PHP - 闪存消息
- PHP 高级
- PHP - MySQL
- PHP.INI 文件配置
- PHP - 数组解构
- PHP - 代码规范
- PHP - 正则表达式
- PHP - 错误处理
- PHP - Try…Catch
- PHP - 调试 Bug
- PHP - 针对 C 开发人员
- PHP - 针对 PERL 开发人员
- PHP - 框架
- PHP - Core PHP 与框架
- PHP - 设计模式
- PHP - 过滤器
- PHP - JSON
- PHP - 异常
- PHP - 特殊类型
- PHP - 哈希
- PHP - 加密
- PHP - is_null() 函数
- PHP - 系统调用
- PHP - HTTP 认证
- PHP - 交换变量
- PHP - Closure::call()
- PHP - 过滤后的 unserialize()
- PHP - IntlChar
- PHP - CSPRNG
- PHP - 期望值
- PHP - use 语句
- PHP - 整数除法
- PHP - 已弃用的特性
- PHP - 已移除的扩展和 SAPI
- PHP - PEAR
- PHP - CSRF
- PHP - FastCGI 进程
- PHP - PDO 扩展
- PHP - 内置函数
- PHP 有用资源
- PHP - 速查表
- PHP - 问答
- PHP - 快速指南
- PHP - 在线编译器
- PHP - 有用资源
- PHP - 讨论
PHP - 方法重载
在 C++ 或 Java 中,这个术语意味着一个类可以拥有多个同名但参数和/或返回类型不同的类方法。在 PHP 中,“重载”这个术语有不同的解释。它是一个可以动态创建属性和方法的特性。PHP 的魔术方法(方法名称以双下划线开头)用于设置动态属性和方法。
用于重载目的的魔术方法在与未声明的属性或方法或当前作用域中不可见的方法交互时被调用。
属性重载
PHP 魔术方法的例子有 __construct()、__destruct()、__toString() 等。PHP 使用以下魔术方法来重载属性。
public __set ( string $name , mixed $value ) : void public __get ( string $name ) : mixed public __isset ( string $name ) : bool public __unset ( string $name ) : void
这里:
__set() 用于将数据写入不可访问的属性(受保护的、私有的或不存在的)。
__get() 从不可访问的属性读取数据。
__isset() 对不可访问的属性调用 isset() 或 empty()。
__unset() 在对不可访问的属性调用 unset() 时被调用。
上面使用的 $name 参数是要设置或检索的属性的名称。__set() 方法的 $value 参数指定要赋给属性的值。
__isset() 方法检查某个属性是否已设置。__unset() 方法删除属性。
属性重载仅在对象上下文中有效。在任何静态上下文中,这些魔术方法都不会被触发。因此,它们不应声明为静态的。
示例
在下面的代码中,设置并检索了一个名为 myprop 的动态属性,该属性未在类中声明。
<?php
class myclass {
public function __set($name, $value) {
echo "setting $name property to $value \n";
$this->$name = $value;
}
public function __get($name) {
echo "value of $name property is ";
return $this->$name;
}
}
$obj = new myclass();
# This calls __set() method
$obj->myproperty="Hello World!";
# This call __get() method
echo "Retrieving myproperty: " . $obj->myproperty . PHP_EOL;
?>
它将产生以下输出:
setting myproperty property to Hello World! Retrieving myproperty: Hello World!
__set() 和 __get() 魔术方法还可以设置和检索声明为私有的属性。在 myclass 中添加以下语句(在函数定义之前):
private $myproperty;
你可以通过在myclass中定义__isset()方法来检查属性:
public function __isset($name) {
return isset($this->$name);
}
使用此语句检查属性是否已设置:
var_dump (isset($obj->myproperty));
在这种情况下,它返回true。
要使用在myclass中定义的__unset()方法来取消设置动态创建的属性:
public function __unset($name) {
unset($this->$name);
}
以下代码将返回false:
var_dump (isset($obj->myproperty));
方法重载
用于动态设置方法的两个魔术方法是__call()和__callStatic()。
public __call (string $name , array $arguments) : mixed public static __callStatic (string $name , array $arguments) : mixed
__call() 在对象上下文中调用不可访问的方法(未定义或私有的)时被触发。另一方面,__callStatic() 在静态上下文中调用不可访问的方法时被触发。
示例
以下示例演示了 PHP 中的方法重载
<?php
class myclass {
public function __call($name, $args) {
// Value of $name is case sensitive.
echo "Calling object method $name with " . implode(" ", $args). "\n";
}
public static function __callStatic($name, $args) {
echo "Calling static method $name with " . implode(" ", $args). "\n";
}
}
$obj = new myclass();
# This invokes __call() magic method
$obj->mymethod("Hello World!");
# This invokes __callStatic() method
myclass::mymethod("Hello World!");
?>
它将产生以下输出:
Calling object method mymethod with Hello World! Calling static method mymethod with Hello World!
请注意,“->”运算符表示该方法是实例方法,“::”运算符表示该方法是静态方法。