php_heredoc

php中heredoc写法

在php中,遇到多行的文字,难免要用到多行文字。这个时候用heredoc是比较好的。之前也用过了,但是又踩到坑了,记录一下

。假设文件总共这6行。因为缺少php的结束标记,所以会在最后一行,加上?>结束标记,这样EOD;就变成了EOD;?>这样的标记,

反正会报错。这个时候,需要在末尾再填加一个新行,即可。

注意:

  • 下面<<<EOT后面不能有空格
  • 注意末尾的结束符必须靠边,其前面不能有空格
  • 此外,里面能添加字符。
<?php
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;

坑一

如上面的代码,若是单独放到一个文件,会自动添加 ?> 然后也会报错。

坑二

2020-06-15 13:32

有问题的代码如下:

<?php
namespace service;
/**
 * User: chaofml
 * Desc: 抓取运单、测试生成fake订单、生成分区表等关的操作
 * Date: 2020年6月12日
 * Time: 13:09 周五
 */



class RecordService
{
    /**  
    * 每个月初的时候,创建下个月的扫描记录表
    * @return mixed sql执行结果
    */ 
    public static function createTable(){
        //创建下一个月的表
        $date = date('Ym',strtotime('first day of +1 months'));
        // $date = date('Ymd');
        $sql = <<<EOL
        CREATE TABLE IF NOT EXISTS `yc_advert_records_$date` (
            `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
            `advert_id` int(10) unsigned NOT NULL COMMENT '广告ID',
            `platform_id` int(10) unsigned NOT NULL COMMENT '广告平台ID',
            `mailno` bigint(13) unsigned NOT NULL COMMENT '运单号',
            `visit_count` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '访问次数',
            `created` datetime NOT NULL COMMENT '创建时间',
            PRIMARY KEY (`id`) USING BTREE,
            KEY `mailno` (`mailno`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='广告访问记录';
    EOL;
        $result = db()->getPdo()->exec($sql);
        return $result;
    }
    /**  
    * 制造假数据,往redis推送数据
    * @return array ['len'=>'redis缓存的数据量',$mails=>[]]
    */ 
    public static function testPush(){
        
        $redis = cache();
        foreach(range(1,100) as $v){
            $mailno = '1:43052'.mt_rand(1000,9999).mt_rand(1000,9999);
            $mails[]=$mailno;
            $size = $redis->rPush('mailno_printer_record',$mailno);
        }
        $len = $redis->llen('mailno_printer_record');
        return ['len'=>$len,'mails'=>$mails];
    }
}

运行报错:

PHP Parse error:  syntax error, unexpected ']', expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in /yd/shell/demo.php on line 46

说的是下面这行报错:

$mails[]=$mailno;   //让我以为php不支持[]语法呢 

解决方式将EOL符号前的空格去掉即可:

EOL;

解决过程思考:一开始我无法定位到错误,以为是php版本问题(确实php版本有影响到EOL的解析),但是将46行的代码抽离出来,发现又没有相关报错了。然后思考,是不是$redis引入的问题,是不是命令空间的问题,是不是类的问题(之前不是在类里面)。最后,才想到,分批次测试代码。然后不到1分钟,顺利定位到bug。

最简单而又使用的调试方式:

代码出错,又不确定哪块出错,哪何不从头一点点的添砖加瓦,每次测试通过,再添加一点代码。

坑三

在yii2项目,云课堂中遇到的。情况是:在windows的版本中没有任何警告,能正常运行。但是docker中的版本遇到了问题:

问题代码如下:

 [
     'class' => 'yii\grid\ActionColumn',
     'template' => <<<EOL
    <div>......</div>
EOL,
     'header' => '操作',
]

EOL那行更改如下,即可:

EOL
,