下面这种写法是否允许?

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疑难杂症的更多相关文章

  1. Carousel 旋转画廊特效的疑难杂症

    疑难杂症 该画廊特效的特点就是前后元素有层级关系. 我想很多人应该看过或者用过这个插件carousel.js,网上也有相关的教程.不知道这个插件的原型是哪个,有知道的朋友可以告诉我. 该插件相对完美, ...

  2. TCP协议疑难杂症全景解析

    说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人. ...

  3. [Swift] 疑难杂症

    [Swift] 疑难杂症 1.class  .... has no initializers -->  class 的每一个元素都需要初始化,否则会报错,除了可空元素

  4. 十个Flex/Air疑难杂症及解决方案简略

    十个Flex/Air疑难杂症及解决方案简略 转自http://blog.sban.us/40.html 最近去一家台企,对方给我出了十道“难道”:在TileList中如果選擇檔過多,會出現捲軸,當拖動 ...

  5. C# (事件触发)回调函数,完美处理各类疑难杂症!

    每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客! 废话说多了...... 嘿嘿:本篇标题为:C#  (事件触发)回调函数,完美处理各类疑难杂症.个人理解如下:事件触发也就是触 ...

  6. 使用truss、strace或ltrace诊断软件的“疑难杂症”

    简介 进程无法启动,软件运行速度突然变慢,程序的"Segment Fault"等等都是让每个Unix系统用户头痛的问题,本文通过三个实际案例演示如何使用truss.strace和l ...

  7. 【转载】TCP协议疑难杂症全景解析

    说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人. ...

  8. IE-“无法浏览网页” 教你十招解决疑难杂症

    “无法浏览网页” 教你十招解决疑难杂症 相信大家也有遇到过像IE不能上网浏览的问题.下面就来给大家介绍一下常见原因和解决方法: 一.网络设置的问题 这种原因比较多出现在需要手动指定IP.网关.DNS服 ...

  9. UDP协议疑难杂症全景解析

    转载:http://blog.csdn.net/dog250/article/details/6896949 UDP协议疑难杂症全景解析 2011-10-22 19:26 2989人阅读 评论(4)  ...

  10. WPF疑难杂症会诊

    原文:WPF疑难杂症会诊 为什么图片像素是模糊的? 容器边框设为非整数时,其内容中的像素图片会产生模糊,即使设置SnapsToDevicePixels="True"也无效. 以下是 ...

随机推荐

  1. WCF实现RESTFul Web Service

    共同学习了前面一些概念,终于开始正题了哈.RESTful的Web Service调用直观,返回的内容容易解析.这里先会描述一个简单的场景--Web Service提供一个方法来搜索个人信息,传入人名, ...

  2. FATFS

     (一),什么是文件管理系统 答:数据在PC上是以文件的形式储存在磁盘中的.这些数据的形式一般为ASCII码或二进制形式.简单点说就是:管理磁盘上的文件的方法的代码! 如:我们写到SD卡上面的数据 ...

  3. [svc]influxdb+grafana实战-各省份api访问成功率统计

    简单说下需求: 统计各个省份的 3大运营商的接口访问成功率,绘图展示 数据格式 {"mobile" : "15812345608", "provinc ...

  4. docker使用问题总结

    1. docker报[Error response from daemon: Error running DeviceCreate (createSnapDevice) dm_task_run fai ...

  5. yii2中的事件和行为

    Event 事件 事件是为了解耦... 注册事件 使用"on add"添加属性,注册事件 使用on方法注册事件. 第三个参数$data是监听函数使用的参数, 第四个$append参 ...

  6. Oracle:shared memory realm does not exist

    1. 先描述一个连接Oracle 10g的错误:“shared memory realm does not exist” 如图所示Sqlplus连接时出现这个错误: 2. Oracle 服务器主要组件 ...

  7. Python教程:[43]Word基本操作

    使用python操作Word用到了win32com模块,我们现在就要介绍一下python对Word的基本操作,文章涉及到如何与Word程序建立连接.如果与Word文档建立连接的,以及对Word文档的基 ...

  8. JDK1.8与spring3.x的不兼容

    今天运气很好,两次遇到了这个兼容性问题,spring3.x不支持 java 1.8 byte code format!! 九月 10, 2017 7:17:18 上午 org.apache.catal ...

  9. Linux - 用户管理常用命令

    1.查看Linux已经存在的用户: [root@CMCC_91 ~]# cut -d : -f 1 /etc/passwd [root@CMCC_91 ~]# cat /etc/passwd |awk ...

  10. 一个美国人对"智能制造"的思考!

    世界上制造业最强的国家仍然是美国!如今,国内工业4.0概念讨论日益喧嚣,中德合作如火如荼,但我们不能否认这个事实. “ 当下,美国似乎失去了世界第一制造大国的称号,而中国的企业也正面临产值下滑.利润下 ...