daveross/phpoverloading

此包已被 废弃 并不再维护。未建议替代包。

PHP 对象的方法重载

v1.0 2016-07-03 18:13 UTC

This package is not auto-updated.

Last update: 2023-06-30 16:06:36 UTC


README

提供一种 PHP 中的方法重载形式的 PHP 特性。当将代码从支持方法重载的语言移植到 PHP 时很有用,但这可能是唯一应该认真考虑使用此库的时候。

严肃地说,如果你在考虑将其用于新的 PHP 代码,问问自己为什么。没有理由添加这种开销,更不用说奇特的方法名称的认知负荷,只是为了重载方法。PHP 已经在没有本地方法重载的情况下运行了这么久。它可以在没有它的情况下运行更久。

就此打住。想想孩子们。

许可证

MIT

了解我为什么为开源软件做出贡献

赞助我一杯咖啡

贡献

欢迎提交拉取请求。鼓励编写单元测试,但不是必需的。

安装

使用 composer

phpoverloading 的 require 语句放入你的 composer.json 文件,然后运行 composer installphp 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_stringexample_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"