PHP疑难杂症
下面这种写法是否允许?
echo '\n' // \n
echo "\n" // 输出换行
直接访问对象不存在的属性,会怎样?
$o = new stdClass();
echo $o->a; // PHP Notice: Undefined property: stdClass::$a
赋值操作符(=) VS if()
$i = 1;
if ($i = 0) {
echo 'true';
} else {
echo 'false';
}
// output: 'false'
这个例子说明,是先进行赋值操作,$i = 0,然后 if(0) 比较值为 false。说明赋值操作优先级要高于if判断。
是否可以连续的赋值语句
如下代码所示,是可以的。
$a = 10;
$b = $d = 10;
echo $b . $d;
// 输出:1010
if 中是否可以直接赋值变量
如下代码所示,是可以的,而且if中定义的变量可以在if之外使用,但不推荐这样。
$a = 9;
if ($b = ($a + 1)) {
echo $b;
}
echo $b;
// 输出:1010
从前端传输过来的数字,在后端接收的是字符串吗?
做个实验不就知道了,代码如下:
<!DOCTYPE html>
<html lang="en">
<?php
if (isset($_POST['age'])) {
var_dump($_POST['age']);
}
?>
<head>
<title>Form Test</title>
</head>
<body>
<form action="" method="POST">
<input type="number" value="1" name="age">
<input type="submit">
</form>
</body>
</html>
结果很显然是字符串,所以此疑惑已经解除。
move_uploaded_file failed to open stream no such file or directory
<?php
# code snippet
if ($tmpFile['error'] == UPLOAD_ERR_OK) {
if (!move_uploaded_file($tmpFile['tmp_name'], $filename)) {
# error log
}
}
# error info
# move_uploaded_file(/path/uploads/b808220d804fc522d252cc1e151275d1): failed to open stream: No such file or directory
已经确认过 /path/uploads/ 这个目录是绝对存在且可写入的。
【已解决】还是目录的问题,我实际建立的目录是 /path/project/uploads,而这里 $filename 的目录是 /path/project/app/uploads,没有意识到 laravel 的 app_path() 方法其实返回的是 app 目录,而不是项目根目录。
PHP异常抛出的问题
posted at 2018-03-13
/**
* 获取文件配置
*
* @param string $key
* @return string
* @throws \Exception
*/
public static function getKFBConfig($key = '')
{
$config = APPLICATION_PATH . '/configs/kfb.ini';
if (file_exists($config)) {
$config = new Zend_Config_Ini($config);
return $config->toArray()[$key];
} else {
throw new Exception('config is not exists!');
}
}
这个方法检测不到配置文件时,则抛出一个异常提供给上级处理。在phpstorm默认配置中,函数体内使用throw抛出异常之后,注释中要加上@throw,不然会提示未注释异常,这个本身没有问题,问题在于调用该方法以至于一层一层向上调用的方法中,每一层方法的注释中都要加上@throw,不然就提示未注释异常。那么为什么不就在这个方法里面处理异常,不抛出到外面呢?或者说,只在这个方法中抛出异常,调用它的方法捕获异常进行处理。
循环里面用try...catch和循环外面用有什么差异?
如题,今天看到一段如下代码,突然产生如此疑惑,其中save()方法可能会发生异常,所以要用try..catch:
foreach ($list as $item) {
$buyer = new BuyerModel();
$buyer->setData([
'customer_id' => $item['customer_id'],
'name' => $item['name'],
]);
try {
$this->_buyerMapper->save($buyer);
} catch (Exception $e) {
// Do Something Log
}
}
如下改造之后,这两者有差异吗?
try {
foreach ($list as $item) {
$buyer = new BuyerModel();
$buyer->setData([
'customer_id' => $item['customer_id'],
'name' => $item['name'],
]);
$this->_buyerMapper->save($buyer);
}
} catch (Exception $e) {
// Do Something Log
}
关于这个问题,我搜索了Google,发现其实是一个try...catch的性能和使用的问题,在 stackoverflow 上面已经有了一个很好的答案,现在摘录在下面,这个答案是回答try..catch的性能问题的,不过也能解释我的这个疑惑。
要注意的是:没有触发异常的 try 块消耗和实际触发异常并产生捕获抛出操作的 try 块的消耗是两件事情。
如果异常只在失败的情况下被抛出,那么几乎不用担心性能问题,因为发生失败通常是很少的情况。如果在一个很简短的循环里面失败了,那么通常是程序有问题而不是性能。所以不必担心抛出异常的消耗,除非你强行在正常逻辑里面使用它。
有些回答会讨论抛出异常情况下的性能分析代码,但我从不会这样做,因为我知道,无论如何,抛出异常的情况比只运行try语句无异常的情况肯定会消耗更多性能。
另外一个需要注意的是:在嵌套很多层循环的情况下,在最外层单个 try...catch 要比每层单独的 try...catch 快一些,因为后者在每一层都要检查返回值并传递错误。反之,如果在每个调用处都包裹一层try..catch,你的代码不仅慢,而且更丑陋。
---------------------------------------- 原文分割线 ----------------------------------------
One thing to consider is that the cost of a try block where no exception is thrown is a different question from the cost of actually throwing and catching an exception.
If exceptions are only thrown in failure cases, you almost certainly don't care about performance, since you won't fail very many times per execution of your program. If you're failing in a tight loop (a.k.a: banging your head against a brick wall), your application likely has worse problems than being slow. So don't worry about the cost of throwing an exception unless you're somehow forced to use them for regular control flow.
Someone posted an answer talking about profiling code which throws an exception. I've never tested it myself, but I confidently predict that this will show a much bigger performance hit than just going in and out of a try block without throwing anything.
Another thing to consider is that where you nest calls a lot of levels deep, it can even be faster to have a single try...catch right at the top than it is to check return values and propagate errors on every call.
In the opposite of that situation, where you find that you're wrapping every call in its own try...catch block, your code will be slower. And uglier.
参考2: https://stackoverflow.com/questions/4673483/php-try-catch-block-inside-loop ,这个问题其实更加针对我的这个问题,最后总结的观点如下:
总结:其实在 PHP 中 try..catch 在循环里面还是外面差别,主要看你如何处理失败情况。
如果遇到异常就退出循环,那么可以用在循环外面
如果遇到异常还想继续执行循环,那么可以用在循环里面
所以最终,我偏向于 try...catch 写在外层,这样只需要一个 try...catch 就可以捕获所有问题,而如果写在里面的话,可能在每个遇到异常的地方都需要加上 try...catch,很不优雅。
PHP Notice: Undefined index:,如何消除这个notice错误?
【解决】使用变量或数组元素之前先用 isset($var) 或者 !empty($var) 判断一下
对于 $var = !empty($var) ? $var : null 这样的表达式需要注意不能写成 $result = !empty($var) ?: null,这样的话,在 $var 不为空时,$result 值为 true,而不是期望的 $var 的值!
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 128 bytes) 什么原因?如何解决?
【解决】php运行时单个脚本消耗内存超过128M.现在设置php.ini中memory_limit=256扩展一倍.
出错代码:!is_null(json_decode($str));
【已解决】原因是$str为非法json字符串,导致解析出问题,与Apache的设置有关
【已解决2】还有一次是因为查询出来的数据太多了,SQL语句写得有问题,在IN条件下的参数值为空,这就导致会查询整个表!
PHP Warning: include(): Filename cannot be empty
PHP Warning: include(): Filename cannot be empty PHP Warning: include(): Failed opening for inclusion (include_path='/home/KFB/application/../library:/home/KFB/library:.:/usr/share/php:/usr/share/pear')
出错代码如下(zend/library/View/View.php),最终确定原因出在apiController中的有些ifelse没有全部情况都考虑到,导致它去实例化Zend_View对象了.
if ($this->_useViewStream && $this->useStreamWrapper()) {
include 'zend.view://' . func_get_arg(0);
} else {
include func_get_arg(0);
}
Error: Class 'Application_Service_Feedbackemail' not found
调试时,出现Error: Class 'Application_Service_Feedbackemail' not found错误,但是该类是存在的,也能够直接通过Phpstorm跳转到定义,什么原因?
【已解决】虽然在类定义的时候名为Application_Service_Feedbackemail,但是其文件名是FeedbackEmail,其中的Email单词是大写的,所以找不到该文件,也就找不到类了。这是因为Zend1框架是根据类名去找相应文件名。
Notes
2017-12-25: 今天找bug学到了两个东西,第一个循环里面一定要小心使用外部作用域中的变量,第二个是trycatch是能执行到外面
2017-12-28: 今天优化代码学到一个,就是缓存数组,而不是仅仅只是缓存这次的变量到下次使用
2018-01-03: 为防止队列无限循环执行,所以每次执行一定要更新updatetime字段,然后每次取要按照updatetime排序取。这样就能保证每次获取的都是最早的,不会因为队列前面的没处理就永远处理不了后面的。这其实就是把处理不了的队列放在队列尾部的意思
2018-01-05: php 从某个字符串开始截取字符串strstr()
2018-02-09: 今天在类里面定义一个属性,是数组,里面有元素是要通过静态类调用获得初始值,发现这样定义始终是语法错误的。换了个方式解决了,直接定义一个方法,返回该数组而不是直接定义该属性数组,这样在方法内是能够调用静态类方法的。
PHP疑难杂症的更多相关文章
- Carousel 旋转画廊特效的疑难杂症
疑难杂症 该画廊特效的特点就是前后元素有层级关系. 我想很多人应该看过或者用过这个插件carousel.js,网上也有相关的教程.不知道这个插件的原型是哪个,有知道的朋友可以告诉我. 该插件相对完美, ...
- TCP协议疑难杂症全景解析
说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人. ...
- [Swift] 疑难杂症
[Swift] 疑难杂症 1.class .... has no initializers --> class 的每一个元素都需要初始化,否则会报错,除了可空元素
- 十个Flex/Air疑难杂症及解决方案简略
十个Flex/Air疑难杂症及解决方案简略 转自http://blog.sban.us/40.html 最近去一家台企,对方给我出了十道“难道”:在TileList中如果選擇檔過多,會出現捲軸,當拖動 ...
- C# (事件触发)回调函数,完美处理各类疑难杂症!
每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客! 废话说多了...... 嘿嘿:本篇标题为:C# (事件触发)回调函数,完美处理各类疑难杂症.个人理解如下:事件触发也就是触 ...
- 使用truss、strace或ltrace诊断软件的“疑难杂症”
简介 进程无法启动,软件运行速度突然变慢,程序的"Segment Fault"等等都是让每个Unix系统用户头痛的问题,本文通过三个实际案例演示如何使用truss.strace和l ...
- 【转载】TCP协议疑难杂症全景解析
说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人. ...
- IE-“无法浏览网页” 教你十招解决疑难杂症
“无法浏览网页” 教你十招解决疑难杂症 相信大家也有遇到过像IE不能上网浏览的问题.下面就来给大家介绍一下常见原因和解决方法: 一.网络设置的问题 这种原因比较多出现在需要手动指定IP.网关.DNS服 ...
- UDP协议疑难杂症全景解析
转载:http://blog.csdn.net/dog250/article/details/6896949 UDP协议疑难杂症全景解析 2011-10-22 19:26 2989人阅读 评论(4) ...
- WPF疑难杂症会诊
原文:WPF疑难杂症会诊 为什么图片像素是模糊的? 容器边框设为非整数时,其内容中的像素图片会产生模糊,即使设置SnapsToDevicePixels="True"也无效. 以下是 ...
随机推荐
- layui 数据表格 根据值(1=业务,2=机构)显示中文名称
数据是用ThinkPHP5操作 类型是固定4个, 用layui templet - 自定义模板 方法一: {field:'type', title: '类型', width: 200, templet ...
- QSettings 使用实例 当需要在程序关闭时保存”状态“信息
用户对应用程序经常有这样的要求:要求它能记住它的settings,比如窗口大小,位置,一些别的设置,还有一个经常用的,就是recent files,等等这些都可以通过Qsettings来实现. 我们知 ...
- bash的输出多行和vim的全部选择
使用cat命令加输出符>来在bash脚本里面输出多行文本是最直观的做法. cat >out.file <<EOF start a line ... ... a line aga ...
- mysql操作及自动化运维
备份恢复工具:percona-xtrabackup-2.0.0-417.rhel6.x86_64.rpm mysql主从配置命令: 主: 1.编辑主MYSQL 服务器的MySQL配置文件my.cnf, ...
- dubbo相关
1 面试题:Dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,发布者和订阅者之间还能通信么? 可以的,启动dubbo时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地.每次 ...
- 0059 Spring MVC与浏览器间的JSON数据转换--@RequestBody--@ResponseBody--MappingJacson2HttpMessageConverter
浏览器与服务器之间的数据交换有很多类型,不只是表单提交数据这一种,比如ajax技术就大量使用json.xml等,这时候就涉及到浏览器端和服务器端数据格式转换的问题,服务器端都是Java对象,需要把请求 ...
- 解决在eclipse中配置Tomcat时,出现"Cannot create a server using the selected type"的错误
比如说使用tomcat 这是因为你之前创建过一次,比如说tomcat6,你指定的目录是:D:/tomcat-6.0.3 后来因为某种原因你把tomcat删了,然后你又安装到了E:/tomcat-6.0 ...
- django model 多对多保存
- mf210v 端口的映射
ttyUSB0 : 诊断端口 ttyUSB1 : AT指令端口 ttyUSB2 : VoUSB端口(语音) ttyUSB3 : Modem端口
- zend stdio 快捷键
1.快速跳转到当前所指的函数.变量.方法.类的定义处 F3或者 ctrl+鼠标左键2.ctrl+m 编辑窗口最大化3.ctrl+d 删除当前行4.ctrl+q 定位到最后编辑的地方(全局的)5.ctr ...