PHP通过runkit覆盖一个方法

首先需要安装runkit扩展

这是原有类

namespace Fyn;

class Hello
{
    public function say(string $name): string {
        return sprintf('Hello %s', $name);
    }
}

通过runkit覆盖(必须先将类load进来才能覆盖)

if (class_exists(\Fyn\Hello:class)) {
    runkit_method_redefine(
        \Fyn\Hello:class,
        'say',
        '$msg',
        'return "Nihao {$msg}";'
    );
}

更多方法:http://php.net/manual/zh/book.runkit.php

不建议在生产环境中使用

Composer如何指定php的版本

这个问题主要出现在本地开发环境的php版本高于生产环境运行的php版本,或构建服务时构建环境的p hp版本高于运行环境的php版本。这时composer会引入一些版本过高的包。可以在composer.json中的config.platform中设置php版本。

{
    "require": {
    }
    "config": {
        "platform" :{
            "php": "5.6",
            "ext-grpc": "1.14",
            "ext-protobuf": "3.5"
        }
    }
}

同时也可以写一下用到的一些扩展,这样在install的时候就不回去检查是否真的装了这些扩展