From 919c540b3f3e5cf8e4ee974fce6a7c7b6ae9579a Mon Sep 17 00:00:00 2001 From: Yurun Date: Thu, 13 Jul 2023 08:32:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=BA=9B=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E5=AD=98=E5=9C=A8=E7=9A=84=E6=95=B0=E7=BB=84=E9=94=AE?= =?UTF-8?q?=E5=90=8D=E6=98=AF=20int=20=E7=B1=BB=E5=9E=8B=E6=97=B6=E7=9A=84?= =?UTF-8?q?=E9=94=99=E8=AF=AF=20(#563)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 修复缓存 setMultiple() 方法传参数组键名是数字 * 修复 * 修复一些可能存在的数组键名是 int 时的错误 * 修复一些可能存在的数组键名是 int 时的错误 * 优化代码 * 优化代码 * 格式化代码 --- dev/bootstrap.php | 11 +++++++ src/Cache/Handler/Apcu.php | 2 +- src/Cache/Handler/File.php | 2 +- src/Cache/Handler/Memory.php | 2 +- src/Cache/Handler/Redis.php | 4 +-- src/Cache/Handler/RedisHash.php | 1 + src/Cache/Handler/RequestContext.php | 2 +- .../fpm/src/Http/Message/FpmResponse.php | 4 +-- src/Components/grpc/src/Client/GrpcClient.php | 2 +- .../grpc/src/Proxy/Http/GrpcHttpClient.php | 4 +-- .../grpc/src/Proxy/Http/GrpcHttpProxy.php | 12 +++---- src/Components/jwt/src/Bean/JWT.php | 4 +-- .../src/Db/Query/Builder/BaseBuilder.php | 2 +- .../src/Db/Query/Builder/InsertBuilder.php | 2 +- .../src/Db/Query/Builder/ReplaceBuilder.php | 2 +- .../src/Db/Query/Builder/UpdateBuilder.php | 2 +- .../src/Http/Message/RoadRunnerResponse.php | 2 +- src/Components/shared-memory/src/Client.php | 2 +- .../swoole/src/Cron/CronManager.php | 2 +- .../src/Http/Message/SwooleResponse.php | 3 +- .../StoreHandler/MemoryTable.php | 2 +- .../Middleware/HandShakeMiddleware.php | 2 +- .../swoole/src/Util/AtomicManager.php | 2 +- .../swoole/src/Util/MemoryTableManager.php | 2 +- .../src/Http/Message/WorkermanResponse.php | 1 + src/Core/App/Contract/BaseApp.php | 2 +- src/Db/Drivers/TPdoStatement.php | 2 +- src/Db/Mysql/Query/Builder/BaseBuilder.php | 2 +- src/Db/Mysql/Query/Builder/InsertBuilder.php | 2 +- src/Db/Mysql/Query/Builder/ReplaceBuilder.php | 2 +- src/Db/Mysql/Query/Builder/UpdateBuilder.php | 2 +- src/Db/Query/Query.php | 2 +- src/Model/Relation/Query.php | 2 +- src/Model/Traits/TModelQuery.php | 2 +- .../ConnectionContext/StoreHandler/Redis.php | 2 +- src/Server/TcpServer/Route/TcpRoute.php | 2 +- src/Server/UdpServer/Route/UdpRoute.php | 2 +- src/Server/WebSocket/Route/WSRoute.php | 2 +- src/Util/Http/AbstractMessage.php | 1 + src/Util/Imi.php | 6 ++-- tests/phpunit.xml | 1 + tests/unit/Component/Tests/BaseCacheTest.php | 31 ++++++++++--------- 42 files changed, 80 insertions(+), 61 deletions(-) diff --git a/dev/bootstrap.php b/dev/bootstrap.php index 4eeebfa247..5d8a4d55b7 100644 --- a/dev/bootstrap.php +++ b/dev/bootstrap.php @@ -174,3 +174,14 @@ function checkPorts(array $ports, string $host = '127.0.0.1', int $tryCount = 30 register_shutdown_function($shutdownCallback); })(); } + +function array_keys_string(array $array): array +{ + $keys = []; + foreach ($array as $key => $_) + { + $keys[] = (string) $key; + } + + return $keys; +} diff --git a/src/Cache/Handler/Apcu.php b/src/Cache/Handler/Apcu.php index 7d57578ff8..2a7030e936 100644 --- a/src/Cache/Handler/Apcu.php +++ b/src/Cache/Handler/Apcu.php @@ -78,7 +78,7 @@ public function setMultiple($values, $ttl = null) $newValues = []; foreach ($values as $k => $v) { - $newValues[$this->parseKey($k)] = $v; + $newValues[$this->parseKey((string) $k)] = $v; } return [] === apcu_store($newValues, null, (int) $ttl); diff --git a/src/Cache/Handler/File.php b/src/Cache/Handler/File.php index ecdd67e31d..41c84ae6ab 100644 --- a/src/Cache/Handler/File.php +++ b/src/Cache/Handler/File.php @@ -206,7 +206,7 @@ public function setMultiple($values, $ttl = null) } foreach ($values as $key => $value) { - $result = $result && $this->set($key, $value, $ttl); + $result = $result && $this->set((string) $key, $value, $ttl); } return $result; diff --git a/src/Cache/Handler/Memory.php b/src/Cache/Handler/Memory.php index 15d35e4f29..aa7b3c85e8 100644 --- a/src/Cache/Handler/Memory.php +++ b/src/Cache/Handler/Memory.php @@ -97,7 +97,7 @@ public function setMultiple($values, $ttl = null) $object = self::$storage; foreach ($values as $key => $value) { - $object->set($key, $value, $ttl ?? 0); + $object->set((string) $key, $value, $ttl ?? 0); } return true; diff --git a/src/Cache/Handler/Redis.php b/src/Cache/Handler/Redis.php index 112a67cd35..2da4528356 100644 --- a/src/Cache/Handler/Redis.php +++ b/src/Cache/Handler/Redis.php @@ -124,7 +124,7 @@ public function setMultiple($values, $ttl = null) } foreach ($setValues as $k => $v) { - $setValues[$this->parseKey($k)] = $this->encode($v); + $setValues[$this->parseKey((string) $k)] = $this->encode($v); } // ttl 支持 \DateInterval 格式 if ($ttl instanceof \DateInterval) @@ -138,7 +138,7 @@ public function setMultiple($values, $ttl = null) { foreach ($setValues as $k => $v) { - $redis->expire($k, $ttl); + $redis->expire((string) $k, $ttl); } } foreach ($redis->exec() as $result) diff --git a/src/Cache/Handler/RedisHash.php b/src/Cache/Handler/RedisHash.php index 9bb860d7e3..4bfcbb9e10 100644 --- a/src/Cache/Handler/RedisHash.php +++ b/src/Cache/Handler/RedisHash.php @@ -168,6 +168,7 @@ public function setMultiple($values, $ttl = null) $setValues = []; foreach ($_setValues as $k => $v) { + $k = (string) $k; $this->parseKey($k, $member); $setValues[$k]['member'][] = $member; $setValues[$k]['value'][] = $this->encode($v); diff --git a/src/Cache/Handler/RequestContext.php b/src/Cache/Handler/RequestContext.php index 5402f11b3a..4151dd9582 100644 --- a/src/Cache/Handler/RequestContext.php +++ b/src/Cache/Handler/RequestContext.php @@ -92,7 +92,7 @@ public function setMultiple($values, $ttl = null) $object = $this->getObject(); foreach ($values as $key => $value) { - $object->set($key, $value, $ttl ?? 0); + $object->set((string) $key, $value, $ttl ?? 0); } return true; diff --git a/src/Components/fpm/src/Http/Message/FpmResponse.php b/src/Components/fpm/src/Http/Message/FpmResponse.php index c2ab556c3e..40bace3e2c 100644 --- a/src/Components/fpm/src/Http/Message/FpmResponse.php +++ b/src/Components/fpm/src/Http/Message/FpmResponse.php @@ -49,14 +49,14 @@ private function sendHeaders(): void { foreach ($headers as $name => $_) { - header($name . ':' . $this->getHeaderLine($name)); + header($name . ':' . $this->getHeaderLine((string) $name)); } } // cookie $cookieParams = $this->getCookieParams(); if ($cookieParams) { - foreach ($cookieParams as $name => $cookie) + foreach ($cookieParams as $cookie) { setcookie($cookie['key'], $cookie['value'], ['expires' => $cookie['expire'] ?? 0, 'path' => $cookie['path'] ?? '/', 'domain' => $cookie['domain'] ?? '', 'secure' => $cookie['secure'] ?? false, 'httponly' => $cookie['httponly'] ?? false]); } diff --git a/src/Components/grpc/src/Client/GrpcClient.php b/src/Components/grpc/src/Client/GrpcClient.php index 77fcd45447..adbbb83ad8 100644 --- a/src/Components/grpc/src/Client/GrpcClient.php +++ b/src/Components/grpc/src/Client/GrpcClient.php @@ -170,7 +170,7 @@ public function send(string $package, string $service, string $name, \Google\Pro { foreach ($metadata as $k => $v) { - $request = $request->withHeader($k, $v); + $request = $request->withHeader((string) $k, $v); } } diff --git a/src/Components/grpc/src/Proxy/Http/GrpcHttpClient.php b/src/Components/grpc/src/Proxy/Http/GrpcHttpClient.php index 73d66a3d49..694f3092fd 100644 --- a/src/Components/grpc/src/Proxy/Http/GrpcHttpClient.php +++ b/src/Components/grpc/src/Proxy/Http/GrpcHttpClient.php @@ -58,7 +58,7 @@ public function request(string $service, string $method, Message $message, strin $responseMetadata = []; foreach ($response->getHeaders() as $name => $_) { - $name = strtolower($name); + $name = strtolower((string) $name); if (str_starts_with($name, 'grpc-')) { $responseMetadata[$name] = $response->getHeaderLine($name); @@ -113,7 +113,7 @@ protected function prepareHttpRequest(string $service, string $method, Message $ { foreach ($metadata as $k => $v) { - $httpRequest->header($k, $v); + $httpRequest->header((string) $k, $v); } } } diff --git a/src/Components/grpc/src/Proxy/Http/GrpcHttpProxy.php b/src/Components/grpc/src/Proxy/Http/GrpcHttpProxy.php index 9c84309c19..6a8803f968 100644 --- a/src/Components/grpc/src/Proxy/Http/GrpcHttpProxy.php +++ b/src/Components/grpc/src/Proxy/Http/GrpcHttpProxy.php @@ -53,21 +53,21 @@ public function proxy(string $poolName, IHttpRequest $request, IHttpResponse $re ProtobufUtil::setMessageData($grpcRequest, $requestData, true); } - /** @var GrpcClient $client */ - $client = RpcClientPool::getInstance($poolName); - /** @var GrpcService $service */ - $service = $client->getService($serviceName, $interface); - // metadata $metadata = []; foreach ($request->getHeaders() as $name => $_) { - if (str_starts_with(strtolower($name), 'grpc-')) + if (str_starts_with(strtolower((string) $name), 'grpc-')) { $metadata[$name] = $request->getHeaderLine($name); } } + /** @var GrpcClient $client */ + $client = RpcClientPool::getInstance($poolName); + /** @var GrpcService $service */ + $service = $client->getService($serviceName, $interface); + // send if (false === ($streamId = $service->send($methodName, $grpcRequest, $metadata))) { diff --git a/src/Components/jwt/src/Bean/JWT.php b/src/Components/jwt/src/Bean/JWT.php index 3d4c386260..45c1098bbc 100644 --- a/src/Components/jwt/src/Bean/JWT.php +++ b/src/Components/jwt/src/Bean/JWT.php @@ -124,7 +124,7 @@ public function getBuilderInstance(?string $name = null): Builder { foreach ($headers as $k => $v) { - $builder->withHeader($k, $v); + $builder->withHeader((string) $k, $v); } } $signer = $config->getSignerInstance(); @@ -156,7 +156,7 @@ public function getBuilderInstance(?string $name = null): Builder { foreach ($headers as $k => $v) { - $builder->withHeader($k, $v); + $builder->withHeader((string) $k, $v); } } } diff --git a/src/Components/pgsql/src/Db/Query/Builder/BaseBuilder.php b/src/Components/pgsql/src/Db/Query/Builder/BaseBuilder.php index 543d1a6f2a..06482210d5 100644 --- a/src/Components/pgsql/src/Db/Query/Builder/BaseBuilder.php +++ b/src/Components/pgsql/src/Db/Query/Builder/BaseBuilder.php @@ -22,7 +22,7 @@ protected function parseField(array $fields): string $params = &$this->params; foreach ($fields as $k => $v) { - if (is_numeric($k)) + if (\is_int($k)) { if ($v instanceof Field) { diff --git a/src/Components/pgsql/src/Db/Query/Builder/InsertBuilder.php b/src/Components/pgsql/src/Db/Query/Builder/InsertBuilder.php index 2a5cd1348b..de88d9e5a6 100644 --- a/src/Components/pgsql/src/Db/Query/Builder/InsertBuilder.php +++ b/src/Components/pgsql/src/Db/Query/Builder/InsertBuilder.php @@ -34,7 +34,7 @@ public function build(...$args): string { if ($v instanceof \Imi\Db\Query\Raw) { - if (!is_numeric($k)) + if (!\is_int($k)) { $fields[] = $query->fieldQuote($k); $valueParams[] = $v->toString($query); diff --git a/src/Components/pgsql/src/Db/Query/Builder/ReplaceBuilder.php b/src/Components/pgsql/src/Db/Query/Builder/ReplaceBuilder.php index 94feea062d..c722a3bfcf 100644 --- a/src/Components/pgsql/src/Db/Query/Builder/ReplaceBuilder.php +++ b/src/Components/pgsql/src/Db/Query/Builder/ReplaceBuilder.php @@ -35,7 +35,7 @@ public function build(...$args): string { if ($v instanceof \Imi\Db\Query\Raw) { - if (is_numeric($k)) + if (\is_int($k)) { $setStrs[] = $v->toString($query); } diff --git a/src/Components/pgsql/src/Db/Query/Builder/UpdateBuilder.php b/src/Components/pgsql/src/Db/Query/Builder/UpdateBuilder.php index f4b67301f0..78413e50e2 100644 --- a/src/Components/pgsql/src/Db/Query/Builder/UpdateBuilder.php +++ b/src/Components/pgsql/src/Db/Query/Builder/UpdateBuilder.php @@ -31,7 +31,7 @@ public function build(...$args): string { if ($v instanceof \Imi\Db\Query\Raw) { - if (is_numeric($k)) + if (\is_int($k)) { $setStrs[] = $v->toString($query); } diff --git a/src/Components/roadrunner/src/Http/Message/RoadRunnerResponse.php b/src/Components/roadrunner/src/Http/Message/RoadRunnerResponse.php index aafc4654cd..a6efc7423b 100644 --- a/src/Components/roadrunner/src/Http/Message/RoadRunnerResponse.php +++ b/src/Components/roadrunner/src/Http/Message/RoadRunnerResponse.php @@ -51,7 +51,7 @@ public function send(): self $cookieParams = $this->getCookieParams(); if ($cookieParams) { - foreach ($cookieParams as $name => $cookie) + foreach ($cookieParams as $cookie) { $this->addHeader(ResponseHeader::SET_COOKIE, $this->cookieArrayToHeader($cookie)); } diff --git a/src/Components/shared-memory/src/Client.php b/src/Components/shared-memory/src/Client.php index 8969eadd44..ee8bb43170 100644 --- a/src/Components/shared-memory/src/Client.php +++ b/src/Components/shared-memory/src/Client.php @@ -21,7 +21,7 @@ public function __construct(array $options = []) $this->client = new \Yurun\Swoole\SharedMemory\Client\Client($options); foreach ($options['storeTypes'] as $k => $v) { - if (is_numeric($k)) + if (\is_int($k)) { $refClass = new \ReflectionClass($v); $this->objects[$refClass->getShortName()] = new $v($this->client); diff --git a/src/Components/swoole/src/Cron/CronManager.php b/src/Components/swoole/src/Cron/CronManager.php index ea9f78e120..cb1b6cbeca 100644 --- a/src/Components/swoole/src/Cron/CronManager.php +++ b/src/Components/swoole/src/Cron/CronManager.php @@ -80,7 +80,7 @@ public function __init(): void $realTasks = &$this->realTasks; foreach ($this->tasks as $id => $task) { - $realTasks[$id] = new CronTask($id, $task['type'], $task['task'], $task['cron'], $task['data'] ?? null, $task['lockExpire'] ?? 120, $task['unique'] ?? null, $task['redisPool'] ?? null, $task['lockWaitTimeout'] ?? 10, $task['force'] ?? false, $task['successLog'] ?? true); + $realTasks[$id] = new CronTask((string) $id, $task['type'], $task['task'], $task['cron'], $task['data'] ?? null, $task['lockExpire'] ?? 120, $task['unique'] ?? null, $task['redisPool'] ?? null, $task['lockWaitTimeout'] ?? 10, $task['force'] ?? false, $task['successLog'] ?? true); } } diff --git a/src/Components/swoole/src/Http/Message/SwooleResponse.php b/src/Components/swoole/src/Http/Message/SwooleResponse.php index 62d422ded1..2a063d4244 100644 --- a/src/Components/swoole/src/Http/Message/SwooleResponse.php +++ b/src/Components/swoole/src/Http/Message/SwooleResponse.php @@ -69,6 +69,7 @@ private function sendHeaders(): void { foreach ($this->headers as $name => $headers) { + $name = (string) $name; $swooleResponse->header($name, $this->getHeaderLine($name)); } } @@ -77,7 +78,7 @@ private function sendHeaders(): void { foreach ($this->trailers as $name => $value) { - $swooleResponse->trailer($name, $value); + $swooleResponse->trailer((string) $name, $value); } } // status diff --git a/src/Components/swoole/src/Server/ConnectionContext/StoreHandler/MemoryTable.php b/src/Components/swoole/src/Server/ConnectionContext/StoreHandler/MemoryTable.php index fc32a33db4..75e69764f8 100644 --- a/src/Components/swoole/src/Server/ConnectionContext/StoreHandler/MemoryTable.php +++ b/src/Components/swoole/src/Server/ConnectionContext/StoreHandler/MemoryTable.php @@ -245,7 +245,7 @@ public function getClientIdByFlag(string $flag): array public function getClientIdsByFlags(array $flags): array { $result = $this->useRedis(fn (RedisHandler $redis) => $redis->hMget($this->key . ':binder', $flags)); - foreach ($result as $k => $v) + foreach ($result as $k => $v) { $result[$k] = (array) $v; } diff --git a/src/Components/swoole/src/Server/WebSocket/Middleware/HandShakeMiddleware.php b/src/Components/swoole/src/Server/WebSocket/Middleware/HandShakeMiddleware.php index 51f62a07e9..75491f2475 100644 --- a/src/Components/swoole/src/Server/WebSocket/Middleware/HandShakeMiddleware.php +++ b/src/Components/swoole/src/Server/WebSocket/Middleware/HandShakeMiddleware.php @@ -103,7 +103,7 @@ private function defaultHandShake(IHttpRequest $request, IHttpResponse $response foreach ($headers as $key => $val) { - $response = $response->setHeader($key, $val); + $response = $response->setHeader((string) $key, $val); } return $response->setStatus(StatusCode::SWITCHING_PROTOCOLS); diff --git a/src/Components/swoole/src/Util/AtomicManager.php b/src/Components/swoole/src/Util/AtomicManager.php index 4aa812a1e2..ffe956a56a 100644 --- a/src/Components/swoole/src/Util/AtomicManager.php +++ b/src/Components/swoole/src/Util/AtomicManager.php @@ -62,7 +62,7 @@ public static function setNames(array $names): void } foreach ($names as $key => $value) { - if (is_numeric($key)) + if (\is_int($key)) { self::$atomics[$value] = 0; } diff --git a/src/Components/swoole/src/Util/MemoryTableManager.php b/src/Components/swoole/src/Util/MemoryTableManager.php index a5256c6b1e..7bff83a8fc 100644 --- a/src/Components/swoole/src/Util/MemoryTableManager.php +++ b/src/Components/swoole/src/Util/MemoryTableManager.php @@ -166,7 +166,7 @@ public static function setNames(array $names): void } foreach ($names as $key => $value) { - if (is_numeric($key)) + if (\is_int($key)) { self::$tables[$value] = 0; } diff --git a/src/Components/workerman/src/Http/Message/WorkermanResponse.php b/src/Components/workerman/src/Http/Message/WorkermanResponse.php index 73febb112c..f2a47afe24 100644 --- a/src/Components/workerman/src/Http/Message/WorkermanResponse.php +++ b/src/Components/workerman/src/Http/Message/WorkermanResponse.php @@ -96,6 +96,7 @@ private function sendHeaders(): void { foreach ($this->headers as $name => $headers) { + $name = (string) $name; $response->header($name, $this->getHeaderLine($name)); } } diff --git a/src/Core/App/Contract/BaseApp.php b/src/Core/App/Contract/BaseApp.php index 10b96647a2..0ac9bee391 100644 --- a/src/Core/App/Contract/BaseApp.php +++ b/src/Core/App/Contract/BaseApp.php @@ -111,7 +111,7 @@ protected function loadDotEnv(): void // 加载 .env 配置 foreach ($_ENV as $name => $value) { - Config::set($name, $value); + Config::set((string) $name, $value); } } } diff --git a/src/Db/Drivers/TPdoStatement.php b/src/Db/Drivers/TPdoStatement.php index 96e6585122..694a964a29 100644 --- a/src/Db/Drivers/TPdoStatement.php +++ b/src/Db/Drivers/TPdoStatement.php @@ -131,7 +131,7 @@ public function execute(array $inputParameters = null): bool { foreach ($inputParameters as $k => $v) { - if (is_numeric($k)) + if (\is_int($k)) { $statement->bindValue($k + 1, $v, $this->getDataTypeByValue($v)); } diff --git a/src/Db/Mysql/Query/Builder/BaseBuilder.php b/src/Db/Mysql/Query/Builder/BaseBuilder.php index 63f0760835..d1f00759c6 100644 --- a/src/Db/Mysql/Query/Builder/BaseBuilder.php +++ b/src/Db/Mysql/Query/Builder/BaseBuilder.php @@ -22,7 +22,7 @@ protected function parseField(array $fields): string $params = &$this->params; foreach ($fields as $k => $v) { - if (is_numeric($k)) + if (\is_int($k)) { if ($v instanceof Field) { diff --git a/src/Db/Mysql/Query/Builder/InsertBuilder.php b/src/Db/Mysql/Query/Builder/InsertBuilder.php index 94a6a51f4e..2bf08f6716 100644 --- a/src/Db/Mysql/Query/Builder/InsertBuilder.php +++ b/src/Db/Mysql/Query/Builder/InsertBuilder.php @@ -35,7 +35,7 @@ public function build(...$args): string { if ($v instanceof \Imi\Db\Query\Raw) { - if (!is_numeric($k)) + if (!\is_int($k)) { $fields[] = $query->fieldQuote($k); $valueParams[] = $v->toString($query); diff --git a/src/Db/Mysql/Query/Builder/ReplaceBuilder.php b/src/Db/Mysql/Query/Builder/ReplaceBuilder.php index 7b0042252d..188bd67953 100644 --- a/src/Db/Mysql/Query/Builder/ReplaceBuilder.php +++ b/src/Db/Mysql/Query/Builder/ReplaceBuilder.php @@ -35,7 +35,7 @@ public function build(...$args): string { if ($v instanceof \Imi\Db\Query\Raw) { - if (is_numeric($k)) + if (\is_int($k)) { $setStrs[] = $v->toString($query); } diff --git a/src/Db/Mysql/Query/Builder/UpdateBuilder.php b/src/Db/Mysql/Query/Builder/UpdateBuilder.php index 554d9c873c..29e7aa7e9f 100644 --- a/src/Db/Mysql/Query/Builder/UpdateBuilder.php +++ b/src/Db/Mysql/Query/Builder/UpdateBuilder.php @@ -28,7 +28,7 @@ public function build(...$args): string { if ($v instanceof \Imi\Db\Query\Raw) { - if (is_numeric($k)) + if (\is_int($k)) { $setStrs[] = $v->toString($query); } diff --git a/src/Db/Query/Query.php b/src/Db/Query/Query.php index 03f0b6c9c2..9523a2b416 100644 --- a/src/Db/Query/Query.php +++ b/src/Db/Query/Query.php @@ -646,7 +646,7 @@ public function orderRaw($raw, array $binds = []): self { foreach ($raw as $k => $v) { - if (is_numeric($k)) + if (\is_int($k)) { $fieldName = $v; $direction = 'asc'; diff --git a/src/Model/Relation/Query.php b/src/Model/Relation/Query.php index bba9acc1fb..ba499b913e 100644 --- a/src/Model/Relation/Query.php +++ b/src/Model/Relation/Query.php @@ -971,7 +971,7 @@ private static function parseManyToManyQueryFields(string $middleModel, string $ $field->setTable($rightTable); $field->setField($name); } - foreach ($rightModelMeta->getSqlColumns() as $name => $sqlAnnotations) + foreach ($rightModelMeta->getSqlColumns() as $sqlAnnotations) { /** @var \Imi\Model\Annotation\Sql $sqlAnnotation */ $sqlAnnotation = $sqlAnnotations[0]; diff --git a/src/Model/Traits/TModelQuery.php b/src/Model/Traits/TModelQuery.php index edc99f49f1..b3883d0571 100644 --- a/src/Model/Traits/TModelQuery.php +++ b/src/Model/Traits/TModelQuery.php @@ -154,7 +154,7 @@ private function hasCustomFields(): bool $k = array_key_first($field); $v = $field[$k] ?? null; - if (is_numeric($k)) + if (\is_int($k)) { if ('*' === $v) { diff --git a/src/Server/ConnectionContext/StoreHandler/Redis.php b/src/Server/ConnectionContext/StoreHandler/Redis.php index ea737e210a..dac04c38b5 100644 --- a/src/Server/ConnectionContext/StoreHandler/Redis.php +++ b/src/Server/ConnectionContext/StoreHandler/Redis.php @@ -389,7 +389,7 @@ public function getClientIdByFlag(string $flag): array public function getClientIdsByFlags(array $flags): array { $result = $this->useRedis(fn (RedisHandler $redis) => $redis->hMget($this->key . ':binder', $flags)); - foreach ($result as $k => $v) + foreach ($result as $k => $v) { $result[$k] = (array) $v; } diff --git a/src/Server/TcpServer/Route/TcpRoute.php b/src/Server/TcpServer/Route/TcpRoute.php index 22795167ce..6a35b1f6e5 100644 --- a/src/Server/TcpServer/Route/TcpRoute.php +++ b/src/Server/TcpServer/Route/TcpRoute.php @@ -93,7 +93,7 @@ private function checkCondition($data, TcpRouteAnnotation $annotation): bool } foreach ($annotation->condition as $name => $value) { - if (ObjectArrayHelper::get($data, $name) !== $value) + if (ObjectArrayHelper::get($data, (string) $name) !== $value) { return false; } diff --git a/src/Server/UdpServer/Route/UdpRoute.php b/src/Server/UdpServer/Route/UdpRoute.php index 520c41673b..88e46f7b83 100644 --- a/src/Server/UdpServer/Route/UdpRoute.php +++ b/src/Server/UdpServer/Route/UdpRoute.php @@ -93,7 +93,7 @@ private function checkCondition($data, UdpRouteAnnotation $annotation): bool } foreach ($annotation->condition as $name => $value) { - if (ObjectArrayHelper::get($data, $name) !== $value) + if (ObjectArrayHelper::get($data, (string) $name) !== $value) { return false; } diff --git a/src/Server/WebSocket/Route/WSRoute.php b/src/Server/WebSocket/Route/WSRoute.php index 01faee8849..4a1471200a 100644 --- a/src/Server/WebSocket/Route/WSRoute.php +++ b/src/Server/WebSocket/Route/WSRoute.php @@ -115,7 +115,7 @@ private function checkCondition($data, WSRouteAnnotation $annotation): bool // 匹配 WebSocket 路由 foreach ($annotation->condition as $name => $value) { - if (ObjectArrayHelper::get($data, $name) !== $value) + if (ObjectArrayHelper::get($data, (string) $name) !== $value) { return false; } diff --git a/src/Util/Http/AbstractMessage.php b/src/Util/Http/AbstractMessage.php index dffb40368d..c814b7f060 100644 --- a/src/Util/Http/AbstractMessage.php +++ b/src/Util/Http/AbstractMessage.php @@ -370,6 +370,7 @@ protected function mergeHeaders(array $headers, self $object = null): self $objectHeaders = &$object->headers; foreach ($headers as $name => $value) { + $name = (string) $name; $lowerName = strtolower($name); if (isset($headerNames[$lowerName])) { diff --git a/src/Util/Imi.php b/src/Util/Imi.php index 4e51b966cb..7808e1a34f 100644 --- a/src/Util/Imi.php +++ b/src/Util/Imi.php @@ -74,7 +74,7 @@ public static function checkCompareRules($rules, callable $valueCallback): bool { foreach ((array) $rules as $fieldName => $rule) { - if (is_numeric($fieldName)) + if (\is_int($fieldName)) { if (!static::checkCompareRule($rule, $valueCallback)) { @@ -367,7 +367,7 @@ public static function getImiCmd(string $commandName, array $arguments = [], arr } foreach ($options as $k => $v) { - if (is_numeric($k)) + if (\is_int($k)) { $cmd .= ' -' . (isset($v[1]) ? '-' : '') . $v; } @@ -400,7 +400,7 @@ public static function getImiCmdArray(string $commandName, array $arguments = [] } foreach ($options as $k => $v) { - if (is_numeric($k)) + if (\is_int($k)) { $cmd[] = '-' . (isset($v[1]) ? '-' : '') . $v; } diff --git a/tests/phpunit.xml b/tests/phpunit.xml index be4aaf7a05..35fe53719d 100644 --- a/tests/phpunit.xml +++ b/tests/phpunit.xml @@ -40,6 +40,7 @@ unit/Component/Tests/CacheFile1Test.php unit/Component/Tests/CacheFile2Test.php unit/Component/Tests/CacheFile3Test.php + unit/Component/Tests/CacheMemoryTest.php unit/Component/Tests/CacheRedisHashTest.php unit/Component/Tests/CacheRedisTest.php unit/Component/Tests/CacheRequestContextTest.php diff --git a/tests/unit/Component/Tests/BaseCacheTest.php b/tests/unit/Component/Tests/BaseCacheTest.php index fc9d56ed4f..95eb406e2b 100644 --- a/tests/unit/Component/Tests/BaseCacheTest.php +++ b/tests/unit/Component/Tests/BaseCacheTest.php @@ -40,11 +40,12 @@ public function testSetTTL(): void public function testSetMultiple(): void { $values = [ - 'k1' => 'v1', - 'k2' => 'v2', + 'k1' => 'v1', + 'k2' => 'v2', + '19940312' => 'yurun', // 数字键名测试 ]; Assert::assertTrue(CacheManager::setMultiple($this->cacheName, $values)); - $getValues = CacheManager::getMultiple($this->cacheName, array_keys($values)); + $getValues = CacheManager::getMultiple($this->cacheName, array_keys_string($values)); Assert::assertEquals($values, $getValues); } @@ -63,13 +64,13 @@ public function testSetMultipleTTL(): void 'k2' => 'v2', ]; Assert::assertTrue(CacheManager::setMultiple($this->cacheName, $values, 1)); - $getValues = CacheManager::getMultiple($this->cacheName, array_keys($values)); + $getValues = CacheManager::getMultiple($this->cacheName, array_keys_string($values)); Assert::assertEquals($values, $getValues); sleep(2); Assert::assertEquals([ 'k1' => 'none', 'k2' => 'none', - ], CacheManager::getMultiple($this->cacheName, array_keys($values), 'none')); + ], CacheManager::getMultiple($this->cacheName, array_keys_string($values), 'none')); }, null, 3); } @@ -84,18 +85,20 @@ public function testDelete(): void public function testDeleteMultiple(): void { $values = [ - 'k1' => 'v1', - 'k2' => 'v2', + 'k1' => 'v1', + 'k2' => 'v2', + '19940312' => 'yurun', // 数字键名测试 ]; Assert::assertTrue(CacheManager::setMultiple($this->cacheName, $values)); - $getValues = CacheManager::getMultiple($this->cacheName, array_keys($values)); + $getValues = CacheManager::getMultiple($this->cacheName, array_keys_string($values)); Assert::assertEquals($values, $getValues); - Assert::assertTrue(CacheManager::deleteMultiple($this->cacheName, array_keys($values))); + Assert::assertTrue(CacheManager::deleteMultiple($this->cacheName, array_keys_string($values))); Assert::assertEquals([ - 'k1' => null, - 'k2' => null, - ], CacheManager::getMultiple($this->cacheName, array_keys($values))); + 'k1' => null, + 'k2' => null, + '19940312' => null, + ], CacheManager::getMultiple($this->cacheName, array_keys_string($values))); } public function testHas(): void @@ -113,13 +116,13 @@ public function testClear(): void 'k2' => 'v2', ]; Assert::assertTrue(CacheManager::setMultiple($this->cacheName, $values)); - $getValues = CacheManager::getMultiple($this->cacheName, array_keys($values)); + $getValues = CacheManager::getMultiple($this->cacheName, array_keys_string($values)); Assert::assertEquals($values, $getValues); Assert::assertTrue(CacheManager::clear($this->cacheName)); Assert::assertEquals([ 'k1' => null, 'k2' => null, - ], CacheManager::getMultiple($this->cacheName, array_keys($values))); + ], CacheManager::getMultiple($this->cacheName, array_keys_string($values))); } }