From d7302ceba5304aa6191e0cf2cf8e4d7906f3d0d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mr=C2=B7x?= Date: Wed, 21 Jul 2021 13:49:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .phpstorm.meta.php | 3 +- Annotation/Inject.php | 29 +- Database/Base/AbstractCollection.php | 6 +- Database/Base/BaseActiveRecord.php | 18 +- Database/Base/CollectionIterator.php | 2 +- System/Core/Str.php | 458 ++++++++++++++------------- function.php | 37 ++- 7 files changed, 309 insertions(+), 244 deletions(-) diff --git a/.phpstorm.meta.php b/.phpstorm.meta.php index 2ea8ba78..cd92eb0a 100644 --- a/.phpstorm.meta.php +++ b/.phpstorm.meta.php @@ -8,6 +8,7 @@ namespace PHPSTORM_META { override(Container::get(0), map('@')); // override(\Hyperf\Utils\Context::get(0), map('@')); // override(\make(0), map('@')); -// override(\di(0), map('@')); + override(\di(0), map('@')); + override(\duplicate(0), map('@')); } diff --git a/Annotation/Inject.php b/Annotation/Inject.php index af411d9c..cd1b7355 100644 --- a/Annotation/Inject.php +++ b/Annotation/Inject.php @@ -7,6 +7,7 @@ namespace Annotation; use Exception; use ReflectionException; use ReflectionProperty; +use Snowflake\Core\Str; use Snowflake\Snowflake; /** @@ -37,16 +38,12 @@ use Snowflake\Snowflake; public function execute(mixed $class, mixed $method = null): bool { $injectValue = $this->parseInjectValue(); - if (!($method instanceof ReflectionProperty)) { - $method = Snowflake::getDi()->getClassProperty($class, $method); - if (!$method) { - return false; - } + if (!($method = $this->getProperty($class, $method))) { + return false; } - /** @var ReflectionProperty $class */ if ($method->isPrivate() || $method->isProtected()) { - $method = 'set' . ucfirst($class->getName()); + $method = 'set' . ucfirst(Str::convertUnderline($method->getName())); if (!method_exists($class, $method)) { return false; } @@ -58,6 +55,24 @@ use Snowflake\Snowflake; } + /** + * @param $class + * @param $method + * @return ReflectionProperty|bool + */ + private function getProperty($class, $method): ReflectionProperty|bool + { + if ($method instanceof ReflectionProperty) { + return $method; + } + $method = Snowflake::getDi()->getClassProperty($class, $method); + if (!$method) { + return false; + } + return $method; + } + + /** * @return mixed * @throws Exception diff --git a/Database/Base/AbstractCollection.php b/Database/Base/AbstractCollection.php index 2c6f1c72..4d38c8b0 100644 --- a/Database/Base/AbstractCollection.php +++ b/Database/Base/AbstractCollection.php @@ -47,10 +47,10 @@ abstract class AbstractCollection extends Component implements \IteratorAggregat * * @param $query * @param array $array - * @param null|string|ActiveRecord $model + * @param string|ActiveRecord|null $model * @throws Exception */ - public function __construct($query, array $array = [], $model = null) + public function __construct($query, array $array = [], string|ActiveRecord $model = null) { $this->_item = $array; $this->query = $query; @@ -111,7 +111,7 @@ abstract class AbstractCollection extends Component implements \IteratorAggregat public function getModel(): ActiveRecord { if (!is_object($this->model)) { - $this->model = $this->model::populate([]); + $this->model = duplicate($this->model); $this->model->setIsCreate(false); } return $this->model; diff --git a/Database/Base/BaseActiveRecord.php b/Database/Base/BaseActiveRecord.php index acb3c777..80381e6a 100644 --- a/Database/Base/BaseActiveRecord.php +++ b/Database/Base/BaseActiveRecord.php @@ -24,7 +24,6 @@ use Database\Relation; use Database\SqlBuilder; use Database\Traits\HasBase; use Exception; -use HttpServer\Http\Context; use ReflectionException; use Snowflake\Abstracts\Component; use Snowflake\Abstracts\Config; @@ -141,13 +140,21 @@ abstract class BaseActiveRecord extends Component implements IOrm, ArrayAccess } + /** + * @param Relation $relation + */ + public function setRelation(Relation $relation) + { + $this->_relation = $relation; + } + + /** * @throws Exception */ public function init() { $this->container = Snowflake::app(); - $an = Snowflake::app()->getAnnotation(); $an->injectProperty($this); } @@ -1010,12 +1017,7 @@ abstract class BaseActiveRecord extends Component implements IOrm, ArrayAccess */ public static function populate(array $data): static { -// $class = Snowflake::app()->getChannel(); -// /** @var static $model */ -// $model = $class->pop(static::class, function () { -// return new static(); -// }); - $model = new static(); + $model = duplicate(static::class); $model->_attributes = $data; $model->_oldAttributes = $data; $model->setIsCreate(false); diff --git a/Database/Base/CollectionIterator.php b/Database/Base/CollectionIterator.php index d0f67829..5424d722 100644 --- a/Database/Base/CollectionIterator.php +++ b/Database/Base/CollectionIterator.php @@ -41,7 +41,7 @@ class CollectionIterator extends \ArrayIterator * @param int $flags * @throws Exception */ - public function __construct($model, $query, $array = array(), $flags = 0) + public function __construct($model, $query, array $array = [], int $flags = 0) { $this->model = $model; $this->query = $query; diff --git a/System/Core/Str.php b/System/Core/Str.php index 1e510b6f..5714fff1 100644 --- a/System/Core/Str.php +++ b/System/Core/Str.php @@ -14,252 +14,264 @@ use Exception; class Str { - const STRING = 'abcdefghijklmnopqrstuvwxyz'; + const STRING = 'abcdefghijklmnopqrstuvwxyz'; - const NUMBER = '01234567890'; + const NUMBER = '01234567890'; - /** - * @param int $length - * - * @return string - * 获取随机字符串 - */ - public static function rand(int $length = 20): string - { - $string = ''; - if ($length < 1) $length = 20; - $default = self::STRING . strtoupper(self::STRING) . self::NUMBER; - $default = str_split($default); - $string .= str_repeat($default[array_rand($default)], $length); - return (string)$string; - } + /** + * @param int $length + * + * @return string + * 获取随机字符串 + */ + public static function rand(int $length = 20): string + { + $string = ''; + if ($length < 1) $length = 20; + $default = self::STRING . strtoupper(self::STRING) . self::NUMBER; + $default = str_split($default); + $string .= str_repeat($default[array_rand($default)], $length); + return (string)$string; + } - /** - * @param int $length - * - * @return int|string 获取随机数字 - * 获取随机数字 - */ - public static function random(int $length = 20): int|string - { - $number = ''; - $default = str_split(self::NUMBER); - if ($length < 1) $length = 1; - $number .= str_repeat($default[array_rand($default)], $length); - return $number; - } + /** + * @param int $length + * + * @return int|string 获取随机数字 + * 获取随机数字 + */ + public static function random(int $length = 20): int|string + { + $number = ''; + $default = str_split(self::NUMBER); + if ($length < 1) $length = 1; + $number .= str_repeat($default[array_rand($default)], $length); + return $number; + } - /** - * @param $string - * @param $sullen - * @param bool $strip_tags - * @param string $append - * - * @return string - */ - public static function cut_str_utf8($string, $sullen, bool $strip_tags = true, string $append = '...'): string - { - if ($strip_tags) { - $string = strip_tags($string); - }//去掉签标 - $pa = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/"; - preg_match_all($pa, $string, $t_string); - $str = ""; - for ($i = 0; $i < count($t_string[0]); $i++) { - $str .= $t_string[0][$i]; - //转为gbk,一个汉字长度为2 - if (strlen(@iconv('utf-8', 'gbk', $str)) >= $sullen) { - if ($i != count($t_string[0]) - 1) $str .= $append; - break; - } - } - return $str; - } + /** + * @param $string + * @param $sullen + * @param bool $strip_tags + * @param string $append + * + * @return string + */ + public static function cut_str_utf8($string, $sullen, bool $strip_tags = true, string $append = '...'): string + { + if ($strip_tags) { + $string = strip_tags($string); + }//去掉签标 + $pa = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/"; + preg_match_all($pa, $string, $t_string); + $str = ""; + for ($i = 0; $i < count($t_string[0]); $i++) { + $str .= $t_string[0][$i]; + //转为gbk,一个汉字长度为2 + if (strlen(@iconv('utf-8', 'gbk', $str)) >= $sullen) { + if ($i != count($t_string[0]) - 1) $str .= $append; + break; + } + } + return $str; + } - /** - * @param $data - * - * @param null $callback - * @return bool - * 判断是否为json字符串 - */ - public static function isJson($data, $callback = null): bool - { - $json = !is_null(json_decode($data)) && !is_numeric($data); - if ($json && is_callable($callback, true)) { - return call_user_func($callback, $data); - } - return $json; - } + /** + * @param $data + * + * @param null $callback + * @return bool + * 判断是否为json字符串 + */ + public static function isJson($data, $callback = null): bool + { + $json = !is_null(json_decode($data)) && !is_numeric($data); + if ($json && is_callable($callback, true)) { + return call_user_func($callback, $data); + } + return $json; + } - /** - * @param $data - * - * @param null $callBack - * @return bool - * 判断是否序列化字符串 - */ - public static function isSerialize($data, $callBack = null): bool - { - $false = !empty($data) && swoole_unserialize($data) !== false; - if ($false && is_callable($callBack, true)) { - return call_user_func($callBack, $data); - } - return $false; - } + /** + * @param $data + * + * @param null $callBack + * @return bool + * 判断是否序列化字符串 + */ + public static function isSerialize($data, $callBack = null): bool + { + $false = !empty($data) && swoole_unserialize($data) !== false; + if ($false && is_callable($callBack, true)) { + return call_user_func($callBack, $data); + } + return $false; + } - /** - * @param $string - * @param int $length - * - * @param string $append - * @return string - */ - public static function cut($string, int $length = 20, string $append = '...'): string - { - if (empty($string)) { - return ''; - } - if ($length < 1) { - $length = 1; - } - $array = str_split($string); - if (count($array) <= $length) { - return implode('', $array); - } - $string = implode('', array_slice($array, 0, $length)); - if (!empty($append)) { - $string .= $append; - } - return $string; - } + /** + * @param $string + * @param int $length + * + * @param string $append + * @return string + */ + public static function cut($string, int $length = 20, string $append = '...'): string + { + if (empty($string)) { + return ''; + } + if ($length < 1) { + $length = 1; + } + $array = str_split($string); + if (count($array) <= $length) { + return implode('', $array); + } + $string = implode('', array_slice($array, 0, $length)); + if (!empty($append)) { + $string .= $append; + } + return $string; + } - /** - * @param $str - * @param int $number - * @param string $key - * - * @return string - */ - public static function encrypt($str, int $number = 10, string $key = 'xshucai.com'): string - { - $res = []; - $add = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; - $len = strlen($key) < 0 ? 1 : (strlen($key) + 5 > strlen($add) ? strlen($add) - 5 : strlen($key)); - if ($number < 1) $number = 10; - $array = str_split($str); - asort($array); - $str = implode('', $array); - for ($i = 0; $i < $number; $i++) { - $_tmp = md5($key) . md5($str) . mb_substr($add, $len, $len + 5, 'utf-8'); - $res[] = md5($_tmp); - } - sort($res, SORT_STRING); - return hash('sha384', implode('', $res)); - } + /** + * @param $str + * @param int $number + * @param string $key + * + * @return string + */ + public static function encrypt($str, int $number = 10, string $key = 'xshucai.com'): string + { + $res = []; + $add = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + $len = strlen($key) < 0 ? 1 : (strlen($key) + 5 > strlen($add) ? strlen($add) - 5 : strlen($key)); + if ($number < 1) $number = 10; + $array = str_split($str); + asort($array); + $str = implode('', $array); + for ($i = 0; $i < $number; $i++) { + $_tmp = md5($key) . md5($str) . mb_substr($add, $len, $len + 5, 'utf-8'); + $res[] = md5($_tmp); + } + sort($res, SORT_STRING); + return hash('sha384', implode('', $res)); + } - /** - * @param $file - * @param $type - * @return string - */ - public static function filename($file, $type): string - { - switch ($type) { - case 'image/png': - return md5_file($file) . '.png'; - case 'image/jpeg': - case 'image/jpg': - return md5_file($file) . '.jpg'; - case 'image/gif': - return md5_file($file) . '.gif'; - break; - } - return md5_file($file); - } + /** + * @param $file + * @param $type + * @return string + */ + public static function filename($file, $type): string + { + switch ($type) { + case 'image/png': + return md5_file($file) . '.png'; + case 'image/jpeg': + case 'image/jpg': + return md5_file($file) . '.jpg'; + case 'image/gif': + return md5_file($file) . '.gif'; + break; + } + return md5_file($file); + } - /** - * @param $endTime - * @param int|null $startTime - * @return array - * 剩余天,带分秒 - */ - public static function timeout($endTime, int $startTime = null): array - { - $endTime = $endTime - (!empty($startTime) ? $startTime : time()); + /** + * @param $endTime + * @param int|null $startTime + * @return array + * 剩余天,带分秒 + */ + public static function timeout($endTime, int $startTime = null): array + { + $endTime = $endTime - (!empty($startTime) ? $startTime : time()); - $day = intval($endTime / (3600 * 24)); + $day = intval($endTime / (3600 * 24)); - $hours = intval(($endTime - ($day * (3600 * 24))) / 3600); + $hours = intval(($endTime - ($day * (3600 * 24))) / 3600); - $minute = intval(($endTime - ($day * (3600 * 24) + $hours * 3600)) / 60); + $minute = intval(($endTime - ($day * (3600 * 24) + $hours * 3600)) / 60); - $scrod = intval(($endTime - ($day * (3600 * 24) + $hours * 3600 + $minute * 60))); + $scrod = intval(($endTime - ($day * (3600 * 24) + $hours * 3600 + $minute * 60))); - return [$day, $hours, $minute, $scrod]; - } + return [$day, $hours, $minute, $scrod]; + } - /** - * @return false|int - */ - public static function get_sy_time(): bool|int - { - $time = strtotime('+1days', strtotime(date('Y-m-d'))); + /** + * @return false|int + */ + public static function get_sy_time(): bool|int + { + $time = strtotime('+1days', strtotime(date('Y-m-d'))); - return $time - time(); - } + return $time - time(); + } - /** - * @param string $string - * @return string - */ - public static function encode(string $string): string - { - return addslashes($string); - } + /** + * @param string $string + * @return string + */ + public static function encode(string $string): string + { + return addslashes($string); + } - /** - * @param string $string - * @return string|string[]|null - * 清除标点符号 - */ - public static function clear(string $string): array|string|null - { - $char = '。、!?:;﹑•"…‘’“”〝〞∕¦‖— 〈〉﹞﹝「」‹›〖〗】【»«』『〕〔》《﹐¸﹕︰﹔!¡?¿﹖﹌﹏﹋'´ˊˋ―﹫︳︴¯_ ̄﹢﹦﹤‐­˜﹟﹩﹠﹪﹡﹨﹍﹉﹎﹊ˇ︵︶︷︸︹︿﹀︺︽︾ˉ﹁﹂﹃﹄︻︼()'; - return preg_replace(array("/[[:punct:]]/i", '/[' . $char . ']/u', '/[ ]{2,}/'), '', $string); - } + /** + * @param string $string + * @return string|string[]|null + * 清除标点符号 + */ + public static function clear(string $string): array|string|null + { + $char = '。、!?:;﹑•"…‘’“”〝〞∕¦‖— 〈〉﹞﹝「」‹›〖〗】【»«』『〕〔》《﹐¸﹕︰﹔!¡?¿﹖﹌﹏﹋'´ˊˋ―﹫︳︴¯_ ̄﹢﹦﹤‐­˜﹟﹩﹠﹪﹡﹨﹍﹉﹎﹊ˇ︵︶︷︸︹︿﹀︺︽︾ˉ﹁﹂﹃﹄︻︼()'; + return preg_replace(array("/[[:punct:]]/i", '/[' . $char . ']/u', '/[ ]{2,}/'), '', $string); + } - /** - * @param int $user - * @param array $param - * @param null $requestTime - * - * @return string - * @throws Exception - */ - public static function token(int $user, array $param = [], $requestTime = NULL): string - { - $str = ''; - if (!$requestTime) { - $requestTime = microtime(true); - } - $_user = str_split(md5($user . md5((string)$user))); - ksort($_user); - foreach ($_user as $key => $val) { - $str .= md5(sha1($key . $val . 'www.xshucai.com')); - } - if (is_array($param)) { - foreach ($param as $key => $val) { - $str .= md5($str . sha1($key . md5($val))); - } - } - $str .= sha1(base64_encode((string)$requestTime)); + /** + * @param int $user + * @param array $param + * @param null $requestTime + * + * @return string + * @throws Exception + */ + public static function token(int $user, array $param = [], $requestTime = NULL): string + { + $str = ''; + if (!$requestTime) { + $requestTime = microtime(true); + } + $_user = str_split(md5($user . md5((string)$user))); + ksort($_user); + foreach ($_user as $key => $val) { + $str .= md5(sha1($key . $val . 'www.xshucai.com')); + } + if (is_array($param)) { + foreach ($param as $key => $val) { + $str .= md5($str . sha1($key . md5($val))); + } + } + $str .= sha1(base64_encode((string)$requestTime)); - $md5 = md5($str . $user); + $md5 = md5($str . $user); - return preg_replace('/(\w{10})(\w{3})(\w{4})(\w{9})(\w{6})/', '$1-$2-$3-$4-$5', $md5); - } + return preg_replace('/(\w{10})(\w{3})(\w{4})(\w{9})(\w{6})/', '$1-$2-$3-$4-$5', $md5); + } + + /** + * @param string $str + * @param bool $unfairest + * @return string + */ + public static function convertUnderline(string $str, bool $unfairest = true): string + { + $str = ucwords(str_replace('_', ' ', $str)); + $str = str_replace(' ', '', lcfirst($str)); + return $unfairest ? ucfirst($str) : $str; + } } diff --git a/function.php b/function.php index c28d2c31..f04e0109 100644 --- a/function.php +++ b/function.php @@ -21,6 +21,7 @@ use Snowflake\Core\Json; use Snowflake\Error\Logger; use Snowflake\Event; use Snowflake\Exception\ConfigException; +use Snowflake\Exception\NotFindClassException; use Snowflake\Snowflake; use Swoole\WebSocket\Server; @@ -681,13 +682,47 @@ if (!function_exists('env')) { } + +if (!function_exists('di')) { + + + /** + * @param string $className + * @return mixed + * @throws ReflectionException + * @throws NotFindClassException + */ + function di(string $className): mixed + { + return Snowflake::getDi()->get($className); + } + +} + +if (!function_exists('duplicate')) { + + + /** + * @param string $className + * @return mixed + * @throws ReflectionException + * @throws NotFindClassException + */ + function duplicate(string $className): mixed + { + $class = di($className); + return clone $class; + } + +} + if (!function_exists('sweep')) { /** * @param string $configPath * @return array|false|string|null */ - function sweep($configPath = APP_PATH . 'config'): bool|array|string|null + function sweep(string $configPath = APP_PATH . 'config'): bool|array|string|null { $array = []; foreach (glob($configPath . '/*') as $config) {