Closed TheNorthMemory closed 1 year ago
注意到,在 f76a57d15562bcb9dbfa08f16ecccb987b2f65a9 及 81a8ef6e2aae3d59f930bc4a658b3062a8e76071 都有类似代码去做接口类强制加载,以支持把分散的命名空间常量加载到,感觉这么做代码就是cv,不够优雅...
翻阅 The composer.json schema
If you want to require certain files explicitly on every request then you can use the files autoloading mechanism. This is useful if your package includes PHP functions that cannot be autoloaded by PHP.
files
从这个功能上看,PHP的函数与(命名空间)常量具有相似的唯一性,仅且只需加载一次,到处可用,建议使用 $.autoload.files 来解决使用 class_exists 强制加载机制。
函数
(命名空间)常量
$.autoload.files
class_exists
补丁方案如下:
补丁
diff --git a/composer.json b/composer.json index c690160..a5034a9 100644 --- a/composer.json +++ b/composer.json @@ -12,6 +12,7 @@ "qcloud" ], "autoload": { + "files": ["src/Contracts/FactoryInterface.php", "src/Contracts/ProviderInterface.php", "src/Contracts/UserInterface.php"], "psr-4": { "Overtrue\\Socialite\\": "src/" } diff --git a/src/Providers/Base.php b/src/Providers/Base.php index 21e4c85..4bb93e1 100644 --- a/src/Providers/Base.php +++ b/src/Providers/Base.php @@ -11,9 +11,6 @@ use Overtrue\Socialite\Exceptions; use Psr\Http\Message\MessageInterface; use Psr\Http\Message\StreamInterface; -class_exists(Contracts\FactoryInterface::class); -class_exists(Contracts\UserInterface::class); - abstract class Base implements Contracts\ProviderInterface { public const NAME = null; diff --git a/src/User.php b/src/User.php index 1154882..eca3554 100644 --- a/src/User.php +++ b/src/User.php @@ -5,9 +5,6 @@ namespace Overtrue\Socialite; use ArrayAccess; use JsonSerializable; -class_exists(Contracts\FactoryInterface::class); -class_exists(Contracts\UserInterface::class); - class User implements ArrayAccess, Contracts\UserInterface, JsonSerializable { use Traits\HasAttributes;
测试:
//file: test.php <?php require_once 'vendor/autoload.php'; print_r(preg_grep('/^Overtrue/', array_keys(get_defined_constants())));
可以看到,常量均已被自动加载,无需在实现类中再去强制加载。
Array ( [2871] => Overtrue\Socialite\Contracts\ABNF_APP_ID [2872] => Overtrue\Socialite\Contracts\ABNF_APP_SECRET [2873] => Overtrue\Socialite\Contracts\ABNF_OPEN_ID [2874] => Overtrue\Socialite\Contracts\ABNF_TOKEN [2875] => Overtrue\Socialite\Contracts\RFC6749_ABNF_CLIENT_ID [2876] => Overtrue\Socialite\Contracts\RFC6749_ABNF_CLIENT_SECRET [2877] => Overtrue\Socialite\Contracts\RFC6749_ABNF_RESPONSE_TYPE [2878] => Overtrue\Socialite\Contracts\RFC6749_ABNF_SCOPE [2879] => Overtrue\Socialite\Contracts\RFC6749_ABNF_STATE [2880] => Overtrue\Socialite\Contracts\RFC6749_ABNF_REDIRECT_URI [2881] => Overtrue\Socialite\Contracts\RFC6749_ABNF_ERROR [2882] => Overtrue\Socialite\Contracts\RFC6749_ABNF_ERROR_DESCRIPTION [2883] => Overtrue\Socialite\Contracts\RFC6749_ABNF_ERROR_URI [2884] => Overtrue\Socialite\Contracts\RFC6749_ABNF_GRANT_TYPE [2885] => Overtrue\Socialite\Contracts\RFC6749_ABNF_CODE [2886] => Overtrue\Socialite\Contracts\RFC6749_ABNF_ACCESS_TOKEN [2887] => Overtrue\Socialite\Contracts\RFC6749_ABNF_TOKEN_TYPE [2888] => Overtrue\Socialite\Contracts\RFC6749_ABNF_EXPIRES_IN [2889] => Overtrue\Socialite\Contracts\RFC6749_ABNF_USERNAME [2890] => Overtrue\Socialite\Contracts\RFC6749_ABNF_PASSWORD [2891] => Overtrue\Socialite\Contracts\RFC6749_ABNF_REFRESH_TOKEN [2892] => Overtrue\Socialite\Contracts\RFC6749_ABNF_AUTHORATION_CODE [2893] => Overtrue\Socialite\Contracts\RFC6749_ABNF_CLIENT_CREDENTIALS [2894] => Overtrue\Socialite\Contracts\ABNF_ID [2895] => Overtrue\Socialite\Contracts\ABNF_NAME [2896] => Overtrue\Socialite\Contracts\ABNF_NICKNAME [2897] => Overtrue\Socialite\Contracts\ABNF_EMAIL [2898] => Overtrue\Socialite\Contracts\ABNF_AVATAR )
:+1:
注意到,在 f76a57d15562bcb9dbfa08f16ecccb987b2f65a9 及 81a8ef6e2aae3d59f930bc4a658b3062a8e76071 都有类似代码去做接口类强制加载,以支持把分散的命名空间常量加载到,感觉这么做代码就是cv,不够优雅...
翻阅 The composer.json schema
从这个功能上看,PHP的
函数
与(命名空间)常量
具有相似的唯一性,仅且只需加载一次,到处可用,建议使用$.autoload.files
来解决使用class_exists
强制加载机制。补丁
方案如下:测试:
可以看到,常量均已被自动加载,无需在实现类中再去强制加载。