PHP 枚举类型的管理与设计知识点总结

来源:脚本之家  责任编辑:小易  

Array ( [0] => 1 [1] => storylok [2] => l

今天来分享下如何管理 PHP 的枚举类型。

/*搜索的语句,如果表名称为table1*/$sql = "select locks

一种常见的方式是,使用常量来代表枚举类型

$str = '78a0*4c5*2f2*23';$pos=-1;do{

const YES = '是'; const NO = '否';

php没有数据类型。。。。。$row['type ']

可以在这个基础上更进一步,将其封装成类,以便于管理

PHP不支持枚举。

class BoolEnum { const YES = '是'; const NO = '否'; }

对常人而言,一胖毁所有,一白遮三丑。在娱乐圈更注重女星形象,聚光灯下的女星们,要比普通人更注重自己的身材样貌,他们时刻与胖做着斗争,与美食忍痛割爱,其过程相当痛苦。香港女明星郑欣宜就是个例子,郑欣宜是出了名的大胖子,郑欣宜要是拍孕妇的戏,肚子的肉肉很多哦,因此,假肚完全可以少一点。这对于女星来说,简直就是奇耻大辱。郑欣宜的父母均是演艺圈的大咖,但她的戏路并没有宽到哪里去。而她的胖经常是媒体关注的,也是嘲笑的,这很让人尴尬。然而,就是这样的一个胖子,减肥成功后,首拍床戏,并且被导演一次收货,实力不容小觑,着实惊艳了一把。在拍摄过程中,郑欣宜是拼了命的十三妹,努力劲是三言两语说不清楚的。郑欣宜减肥

现在,我们希望能通过方法来动态调用对应的枚举类型

人的大脑70%未开发,而神是完全开放的——神的大智慧,人的小聪明未触及到。可不可以这样理解?多年前,联合国曾经用世界著名的盖洛普民意测验方法进行了一项调查,即调查最近300年间的300位最著名的科学家是否相信神。其中除38位因无法查明其信仰而不计以外,其余262位科学家中,信神者有242人,占92.4%;不信神者仅有20人,占总数的7.6%。除了这些人类历史上伟大的科学家相信造物主的存在外,当今世界各国科学家信神者亦非罕见。在这些科学家看来,科学与宗教并非是排斥关系。他们可以一方面探讨世界的奥秘,一方面赞叹神的伟大。世上到底有没有神?爱因斯坦曾接受记者访问,请他谈对神是否存在的看法。爱因斯坦刚

BoolEnum::YES(); // 是 BoolEnum::NO(); // 否

时下双摄手机的方案一般有两种:增加背景虚化功能的一主一副组合,或者增强成像(含背景虚化)的双子组合。但无论哪一种,两个摄像头都有各自分工。vivoXplay6采用的是纯粹的主副设计,1200万像素主摄像头负责成像,500万副摄像头专用于测距。而vivoXplay6成像惊艳,自然也是因为这颗素质优秀的主头。无论任何拍照设备,都是对光线的捕捉从而产生图像。通过光圈、快门控制进光量,并通过ISO值提高画面亮度。然而快门太慢会产生画面抖动,ISO值过高会增加噪点,因此提高光圈值是个好选择。vivoXplay6采用的F1.7光圈摄像头,也是目前业界的最高标准。

也可以批量获取枚举类型

铲屎官们在撸狗的时候,是不是经常发现汪星人会把白白的大肚子展现在你面前?对于狗狗来说,肚子是它的一个很重要的部位,也是个要害,很多狗狗会露出自己的肚皮来向铲屎官示好。一般的铲屎官都认为狗狗这样是在撒娇、求摸,但其实狗狗翻肚皮还有其他原因。1.表示在乎狗狗除了会用激烈的摇尾巴方式来表示自己喜欢一个人,它们还会张嘴吐舌头开心的看着你,再有就是把自己的肚子露出来。这时候它们就是在说:我很在乎你、喜欢你、信任你哦。2.表示臣服铲屎官在汪星人眼中就像王一样的存在,它们把你当做自己的老大。在想要向你示弱,表示投降臣服的时候,狗狗也会翻起肚子,不过这个时候它们一般不敢看你的眼睛,而且尾巴会卷向肚子方向。3.

BoolEnum::toArray(); // ['Yes' => '是', 'No' => '否']

下面来实现上面列举的功能。

定义基本的枚举基类,让所有的枚举类都继承该抽象基类。

abstract class Enum { // 获取所有枚举类型 public static function toArray(){ // 通过反射获取常量 $reflection = new \ReflectionClass(static::class); $contants = $reflection->getConstants(); // 返回对应的常量 return $contants; } // 动态调用属性 public static function __callStatic($name, $arguments) { $arr = static::toArray(); if(isset($arr[$name])){ return $arr[$name]; } throw new \BadMethodCallException("找不到对应的枚举值 {$name}"); } } class BoolEnum extends Enum { const YES = '是'; const NO = '否'; }

利用反射,可以获取到所有的枚举类型。同时,利用魔术方法则可以实现对属性的动态调用。这里要注意的是,反射会消耗较多的资源,因此,对 toArray 方法进行重构,增加一个缓存变量来缓存获取到的枚举类型,避免重复使用反射。

abstract class Enum { protected static $cache = []; public static function toArray(){ $class = static::class; // 第一次获取,就通过反射来获取 if(! isset(static::$cache[$class])){ $reflection = new \ReflectionClass(static::class); static::$cache[$class] = $reflection->getConstants(); } return static::$cache[$class]; } }

现在考虑更多的使用场景,比如用实例来代表特定枚举类型

$yes = new BoolEnum("是"); echo $yes; // "是"

实现如下

abstract Enum { protected $value; public function __construct($value) { if ($value instanceof static) { $value = $value->getValue(); } if(! $this->isValid($value)){ throw new \UnexpectedValueException("$value 不属于该枚举值" . static::class); } $this->value = $value; } // 获取实例对应的键 public function getKey(){ return array_search($this->value, static::toArray(), true); } // 获取实例对应的值 public function getValue() { return $this->value; } // 允许字符串形式输出 public function __toString() { return $this->value; } // 验证值是否合法 public function isValid($value) { $arr = static::toArray(); return in_array($value, $arr, true); } // 验证键是否合法 public function isValidKey($key) { $arr = static::toArray(); return array_key_exists($key, $arr); } }

这样做可避免用户使用非法的枚举类型的值

$user->banned = '非法值'; // 可能不会报错 $yes = new BoolEnum("非法值"); // 将会抛出异常 $user->banned = $yes;

或者作为参数类型限定

function setUserStatus(BoolEnum $boolEnum){ $user->banned = $boolEnum; }

PHP 作为一门弱类型语言,参数限定的不足会导致很多不可预期的错误发生,通过使用枚举类,我们进一步加强了参数限定的功能,同时,管理枚举类型也更加的方便统一。

以上就是本次介绍的全部相关知识点,感谢大家的学习和对脚本之家的支持。

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

PHP如何枚举二维数组的键名跟值?

PHP处理数组功能还是很强大的,有几维就调用几次foreachforeach ($arr as $ak => $av) { foreach ($av as $_k => $_v) { echo $_v; }}

php枚举指定路径所有文件速度很慢怎么解决

  PHP中file_get_contents函数的作用是获取一个 URL 的返回内容。如果是url响应速度慢,或者网络等因素,会造成等待时间较长的情况。只需设置一下file_get_contents函数的超时时间即可解决。示例代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<?php

//设置超时参数【超时:timeout】

$parm=array(

"http"=>array(

"method"=>"GET",

"timeout"=>3

),

);

////创建数据流上下文

$context = stream_context_create($opts);

//$url请求的地址,例如:

$result =file_get_contents($url, false, $context);

// 打印结果

<a href="https://www.baidu.com/s?wd=print_r&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3n163uHNWPHIbuW7huARL0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3En1bsPj6vP1n4nH03n1DvP1md" target="_blank" class="baidu-highlight">print_r</a>($result);

?>

PHP字符串枚举

代码示例如下图供参考:

<?php

$str = 'abcde';

$a =str_split($str);

perm($a, 0, count($a)-1);

function perm(&$ar, $k, $m) {

    if($k == $m){

        echo join('',$ar) .'<br />';

    }else {

        for($i=$k; $i<=$m; $i++) {

            swap($ar[$k], $ar[$i]);

            perm($ar, $k+1, $m);

            swap($ar[$k], $ar[$i]);

        }

    }

}

function swap(&$a, &$b) {

    $c = $a;

    $a = $b;

    $b = $c;

}

?>

运行截图:

Php中用Enum 如何限定参数类型

<?php// 两个类的对象$myclass = new MyClass;$otherclass = new OtherClass;// 致命错误:第一个参数必须是 OtherClass 类的一个对象$myclass->test('hello');// 致命错误:第一个参数必须为 OtherClass 类的一个实例$foo = new stdClass;$myclass->test($foo);// 致命错误:第一个参数不能为 null$myclass->test(null);// 正确:输出 Hello World$myclass->test($otherclass);// 致命错误:第一个参数必须为数组$myclass->test_array('a string');// 正确:输出数组$myclass->test_array(array('a', 'b', 'c'));// 正确:输出 ArrayObject$myclass->test_interface(new ArrayObject(array()));// 正确:输出 int(1)$myclass->test_callable('var_dump', 1);?>

PHP初学者,看到mysqli_result->fetch_row() 说是以一个枚举数组方式返回一行结果。枚举数组到底是什么?

简单的讲一下,上代码给你看

//下标全是数字的数组叫做索引数组,其实定义索引数组比这个简单,为了让你看明白,就这样写了,下标可以不连着,就如从2直接到100一样,但是如果有一个不是数字,那这个就不是索引数组了,就变成关联数组了

//索引数组

$arr = array(

0 => 'aaa',

1 => 'bbb',

2 => 'ccc',

100 => 'ddd'

);

print_r($arr);

//上面那个数组可以直接这样定义 除了下标不一样;

$arr = array('aaa','bbb','ccc','ddd');

print_r($arr);

//关联数组

$arr = array(

'name' => '张三',

'age' => '20',

2 => 'A',

'sex' => '男'

);

print_r($arr);

 运行结果如下

Array

(

    [0] => aaa

    [1] => bbb

    [2] => ccc

    [100] => ddd

)

Array

(

    [0] => aaa

    [1] => bbb

    [2] => ccc

    [3] => ddd

)

Array

(

    [name] => 张三

    [age] => 20

    [2] => A

    [sex] => 男

)追问谢谢,这两种数组我明白了。那什么样子的数组才叫做枚举数组呢?这是我用fetch_row()得到的一个枚举数组

Array

(

[0] => 10

[1] => 9

[2] => 1

[3] => 111111111111111

)和索引数组我感觉并没有什么区别,难道枚举数组就是索引数组,我用的手册翻译有问题?

  • 本文相关:
  • php中enum(枚举)用法实例详解
  • thinkphp5.0多个文件上传后找不到临时文件的修改方法
  • yii实现checkbox复选框在同一行显示的方法
  • 使用laravel中的查询构造器实现增删改查功能
  • php公用函数列表[正则]
  • yii使用deleteall连表删除出现报错问题的解决方法
  • php实现的mysql通用查询程序
  • 分享5个非常有用的laravel blade指令
  • laravel5.1 框架表单验证操作实例详解
  • php 提速工具eaccelerator 配置参数详解
  • 有道搜索和ip138的ip的api接口(php应用)
  • PHP如何枚举二维数组的键名跟值?
  • php枚举指定路径所有文件速度很慢怎么解决
  • PHP字符串枚举
  • Php中用Enum 如何限定参数类型
  • PHP初学者,看到mysqli_result->fetch_row() 说是以一个枚举数组方式...
  • php 怎么获得mysql数据库字段枚举
  • php页面如何转换mysql中的enum类型
  • PHP字符串中间有*号,写程序枚举列出
  • php 如何获取SQL 里面数据类型是enum的值?
  • php支持枚举类型吗
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved