daveross / phpoverloading
PHP 对象的方法重载
Requires
- php: >=5.5
Requires (Dev)
- php: >=5.5
- phpunit/phpunit: 4.7.*
This package is not auto-updated.
Last update: 2023-06-30 16:06:36 UTC
README
提供一种 PHP 中的方法重载形式的 PHP 特性。当将代码从支持方法重载的语言移植到 PHP 时很有用,但这可能是唯一应该认真考虑使用此库的时候。
严肃地说,如果你在考虑将其用于新的 PHP 代码,问问自己为什么。没有理由添加这种开销,更不用说奇特的方法名称的认知负荷,只是为了重载方法。PHP 已经在没有本地方法重载的情况下运行了这么久。它可以在没有它的情况下运行更久。
就此打住。想想孩子们。
许可证
了解我为什么为开源软件做出贡献 。
贡献
欢迎提交拉取请求。鼓励编写单元测试,但不是必需的。
安装
使用 composer
将 phpoverloading
的 require 语句放入你的 composer.json
文件,然后运行 composer install
或 php composer.phar install
{ "require": { "daveross/phpoverloading": "~1.0" } }
手动
将文件包含在 src
目录中,或根据需要包含单个文件
<?php include 'path/to/phpoverloading/src/OverloadedMethods.php';
使用
通过在类体内部使用 use \DaveRoss\PHPOverloading\OverloadedMethods;
将特性应用到你的类中。
支持的参数类型
识别所有 PHP 的本地类型
- boolean
- integer
- float
- string
- array
- object
此外,特性还识别类名和类层次结构。
关于方法命名的说明
PHP 不允许函数或方法具有相同的名称。这可能是实际方法重载的最大障碍。因此,您需要将参数类型追加到每个函数的名称中。
例如,如果您有两个名为 example
的方法,一个接受字符串,另一个接受数组,您将分别命名为 example_string
和 example_array
,但在调用时,您只需引用 $foo->example()
并传递一个字符串或数组,就会发生 魔法。
如果一个方法接受多个参数,则它们的类型会连接到函数名称中,用下划线分隔,例如 example_string_integer_float
。重载方法可以接受不同数量的参数。
构造函数就像任何其他函数一样。你可以有 __construct_string
和 __construct_object
,如果你想的话。但还有一个默认构造函数的后缀 _default
(即 __construct_default
),当构造函数没有传入任何参数时会被调用。
类层次结构
假设你有这些类
class A {} class B extends A{}; class Foo { function __construct_a() { ... } }
如果你调用 Foo 的构造函数并传入类 B 的一个实例,特性找不到匹配的 __construct_b
函数,所以它会遵循对象层次结构并调用 __construct_a
,传入 B 的实例。
如果没有 __construct_a
方法,它将作为后备查找 __construct_object
。
构造函数重载
class Example { use \DaveRoss\PHPOverloading\OverloadedMethods; public $string, $integer; public function __construct_string($val) { $this->string = $val; } public function __construct_integer($val) { $this->integer = $val; } } $strExample = new Example("hello world"); $intExample = new Example(5);
方法重载
class Example { use \DaveRoss\PHPOverloading\OverloadedMethods; public $string, $integer; public function example_string($val) { echo 'the string is ' . $val; } public function example_integer($val) { echo 'the integer is ' . $val; } } $x = new Example(); $x->example("hello world"); // echoes "the string is hello world" $x->example(5); // echoes "the integer is 5"