1、yield 核心原理是什么
https://blog.csdn.net/qq_20329253/article/details/52202811/
https://www.jianshu.com/p/78cb20f4b0f4
使用场景:PHP开发很多时候都要读取大文件,比如csv文件、text文件,或者一些日志文件。这些文件如果很大,比如5个G。这时,直接一次性把所有的内容读取到内存中计算不太现实
set_time_limit(0);
$a = memory_get_usage();
function getTexts()
{
$file_path = "aa.log"; //130M
$fd = fopen($file_path,"rb");
while(!feof($fd))
{
yield fgets($fd);
}
}
foreach( getTexts() as $val)
{
echo '<pre>';
// print_r($val);
}
$b = memory_get_usage();
var_dump($b-$a);
2、echo print print_r var_dump区别
echo()
可以一次输出多个值,多个值之间用逗号分隔。echo是语言结构(language construct),而并不是真正的函数,因此不能作为表达式的一部分使用。
print()
函数print()打印一个值(它的参数),如果字符串成功显示则返回true,否则返回false。
print_r()
可以把字符串和数字简单地打印出来,而数组则以括起来的键和值得列表形式显示,并以Array开头。但print_r()输出布尔值和NULL的结果没有意义,因为都是打印"\n"。因此用var_dump()函数更适合调试。
var_dump()
判断一个变量的类型与长度,并输出变量的数值,如果变量有值输的是变量的值并回返数据类型。此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
3 empty isset is_null区别
变量 | empty | is_null | isset |
---|---|---|---|
$a=”” | true | false | true |
$a=null | true | true | false |
var $a | true | true | false |
$a=array() | true | false | true |
$a=false | true | false | true |
$a=15 | false | false | true |
$a=1 | false | false | true |
$a=0 | true | false | true |
$a=”0” | true | false | true |
$a=”true” | false | false | true |
$a=”false” | false | false | true |
1.is_null
<span style="font-size:18px;">//is_null
var_dump(is_null($a));//报错,且返回true
$age;
var_dump(is_null($age));//报错,且返回true
$age = null;
var_dump(is_null($age));//true
$mengyunzhi = 1;
var_dump(is_null($mengyunzhi));//false</span>
有以上代码可以看出,我们一般用is_null来判断已存在的变量的值是否为null。
2.isset
<span style="font-size:18px;">//isset
var_dump(isset($meng));//false
$yun = null;
var_dump(isset($yun));//false
$zhi = 1;
var_dump(isset($zhi));//true</span>
isset用来判断变量是否存在或者为null。细心的你可能会发现一个有趣的现象,只要is_null为true,isset就为false,反之亦然。
3.empty
<span style="font-size:18px;">//empty
$mengyun = 1;
var_dump(empty($mengyun));//false
$test = null;
var_dump(empty($test));//true
$test = '0';
var_dump(empty($test));//true
var_dump(empty($char));//true</span>
empty用来判断变量存在,且值不为0,‘0’,null,false,array()等等。
5、抽象类和接口的异同
1. 相同点:
(1) 两者都是抽象类,都不能实例化。
(2) interface 实现类及 abstractclass 的子类都必须要实现已经声明的抽象方法。
2. 不同点:
(1) interface 需要实现,要用 implements ,而 abstractclass 需要继承,要用 extends 。
(2) 一个类可以实现多个 interface ,但一个类只能继承一个 abstractclass 。
(3) interface 强调特定功能的实现,而 abstractclass 强调所属关系。