您的位置 首页 知识分享

像对待对象一样使用变量

本文仅代表个人观点,不构成任何建议。 Ruby和JavaScript等语言的一个吸引人的特性是其变量作为对象处…

像对待对象一样使用变量

本文仅代表个人观点,不构成任何建议。

Ruby和JavaScript等语言的一个吸引人的特性是其变量作为对象处理的方式。这种设计在某些情况下提升了,但在另一些情况下则并非如此。

例如:

# Ruby程序,演示length方法 str = "hello, world!" puts str.length # 在控制台打印13
登录后复制

PHP中的等效代码:

$str = 'hello, world!'; echo strlen($str);
登录后复制

在我看来,Ruby或JavaScript的写法更具可读性,因为变量充当主语,方法充当谓语。

PHP不支持这种代码风格,因此我创建了一个类来模拟这种行为。但请注意,此类仅供学习和实验,不建议在生产环境中使用,因为它可能存在性能问题。

<?php namespace scalar;  use Exception; use ReflectionFunction;  class scalar {    private $scalar;    public function __construct($scalar) {     if (!is_scalar($scalar)) {       throw new Exception('非标量值');     }     $this->scalar = $scalar;   }    public function __call($method, $arguments) {     if (!function_exists($method)) {       throw new Exception('函数' . $method . '不存在');     }      if (!empty($arguments) && array_keys($arguments) !== range(0, count($arguments) - 1)) {       $reffunc = new ReflectionFunction($method);       $params = $reffunc->getParameters();        $mappedargs = [];       foreach ($params as $param) {         $name = $param->getName();         if (isset($arguments[$name])) {           $mappedargs[] = $arguments[$name];         } elseif ($name === 'data') {           $mappedargs[] = $this->scalar;         } elseif ($param->isDefaultValueAvailable()) {           $mappedargs[] = $param->getDefaultValue();         } else {           throw new Exception("函数$method缺少必需参数:$name");         }       }        return $reffunc->invokeArgs($mappedargs);     } else {       array_unshift($arguments, $this->scalar);       return call_user_func_array($method, $arguments);     }   }    public function getScalar() {     return $this->scalar;   } }
登录后复制

重要的是,为了使此类正常工作,需要使用将变量名放在前面的函数调用方式。

<?php $data = new customerdata(     name: $input['name'],     email: $input['email'],     age: $input['age'], ); ?>
登录后复制

以下示例演示了如何使用这个类调用单参数和多参数函数:

<?php try {     $a = 'hola mundo';     $a_object = new scalar($a);      $result = $a_object->hash(algo: 'sha256', binary: true);     echo $result; // 'hola mundo'的二进制SHA256哈希值      echo $a_object->strlen(); // 返回10 ('hola mundo'的长度) } catch (Exception $e) {     echo '错误:' . $e->getMessage(); } ?>
登录后复制

以上就是像对待对象一样使用变量的详细内容,更多请关注php中文网其它相关文章!

本文来自网络,不代表甲倪知识立场,转载请注明出处:http://www.spjiani.cn/wp/7727.html

作者: nijia

发表评论

您的电子邮箱地址不会被公开。

联系我们

联系我们

0898-88881688

在线咨询: QQ交谈

邮箱: email@wangzhan.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部