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
,