1. 云栖社区>
  2. PHP教程>
  3. 正文

由一些小问题引发的思考

作者:用户 来源:互联网 时间:2017-12-01 13:41:41

问题思考些小引发

由一些小问题引发的思考 - 摘要: 本文讲的是由一些小问题引发的思考,如何判断数组是否为空?c++实现 //stl容器里面可以利用empty, count等方法去判断是否含有元素 std::vector<int> iVec; if(iVec.count() <= 0 || iVec.empt

如何判断数组是否为空?
c++实现
 //stl容器里面可以利用empty, count等方法去判断是否含有元素
std::vector<int> iVec;
if(iVec.count() <= 0 || iVec.empty()){
// 空容器
}
// 基本的内置类型数组 可以结合sizeof来判断。当然如果是数组的话,就不应该为空,int a[0]编译器会报错。
// 如果我们想判断数组内元素数量,可以如下判断。
int nArray[10];
memset(nArray, 0);
int nCount = sizeof(nArray) / sizeof(int[0]);

php实现
 //由于php数组是动态的,数组可以是空的
$array = array();
if(count($array) <=0 || sizeof($array) <= 0){
//空:sizeof 和 count是等价的 别名关系
}
if(empty($array)){
//空:
}


关于PHP的empty函数php-manual中这样解释:
一下情况empty均返回 true


"" (空字符串)
0 (作为整数的0)
0.0 (作为浮点数的0)
"0" (作为字符串的0)
NULL
FALSE
array() (一个空数组)
$var; (一个声明了,但是没有值的变量)

php 不同类型的变量之间的比较
$x = "xxyy";
$y = 0;
var_dump(max($x , $y)); // $x
$a = 'a';
$b = 'b';
var_dump(max($a , $b) ); // $b
$arr = [1];
$num = 100;
var_dump(max($arr , $num)); // $arr



查阅了PHP Manual 得到如下反馈:
http://www.php.net/manual/zh/language.operators.comparison.php
多种类型比较时的结果。
Warning
由于浮点数 float 的内部表达方式,不应比较两个浮点数float是否相等。




0作为除数会怎样?
echo "如果除数是0会怎么样?";
$num1 = 10;
$num2 = 0;
$num = $num1/$num2;
var_dump($num);

这时候程序运行的时候会产生一条警告:


如果除数是0会怎么样?
Warning: Division by zero in D:/temp/helloworld.php on line 18
float(INF)

所以我们如果后面仍然需要使用$num去参与运算的话,后面的结果肯定是无法预料的。为了保证程序运行期间的稳定性,我们需要除法之前判断除数是否为0使用异常处理


曾天真地以为'使用异常处理'能捕获到除数为0这样的异常,然而并不是:


# 刚开始以为这样会在$num2==0的时候抛出一个异常,然而并没有。接下来我开始怀疑是不是因为PHP这种语言无法捕获到'0作为除数'这种异常?C++一定行!
try{
$num = $num1/$num2;
}
catch(Exception $e){
echo $e->getMessage();
}
# 于是我试了试C++:

int dev = 0;
int num = 10;
try{
std::cout << "result:" << num / dev << std::endl;
}
catch(...){
std::cout << "found exception:" << GetLastError() << std::endl;
}

看到结果的时候我为自己盲目地'自信'感觉到好笑:C++也并没有抛出异常,报了一个运行期间的错误:


Curiosity.exe 中的 0x0104104a 处有未经处理的异常: 0xC0000094: Integer division by zero


所以,这是为什么呢?最后得到的答案是这样的:
http://stackoverflow.com/questions/10460957/why-cant-catch-exception-in-a-constructor


An Integer divided by zero is not an standard C++ exception. So You just cannot rely on an exception being thrown implicitly.
Best you can do is to check the error condition(divisor equals zero) yourself and throw an exception explicitly.


所以最后对代码做了这样的修改,其实和手动判断已经没有太大的区别了。


$num1 = 10;
$num2 = 0;
try{
if(intval($num2) == 0){throw new Exception("0 作为除数");
}
$num = $num1/$num2;
}
catch(Exception $e){
echo $e->getMessage();
}

另外,如果不加判断的话遇到除数是0的表达式会返回一个INF值,INF means infinity 程序并不会报错。


array_merge的小陷阱:
$ar_empty = [];
$ar_null = null;
$array = [1,2,3];
var_export(array_merge($array, $ar_empty)); // 结果为$array的内容
var_export(array_merge($array, $ar_null)); // 警告 结果为NULL

php 5.0 以后array_merge中仅支持数组作为参数。 那如果传入NULL的话,不管其他元素是不是NULL,结果都会是NULL。


以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索问题 , 思考 , 些小 引发 ,以便于您获取更多的相关知识。