1. PHP 基础入门
1.1.1. PHP vs Java vs C
- C/C++,编译成机器语言(二进制)来运行
- Java 编译成.class 文件,称为 bytecode,由 jvm 来运行,Java 语言不垮平台,是 JVM 跨平台。
- 严格说,PHP 是一门编译语言,由 zend 虚拟机编译成 opcode,在执行 opcode
- Opcode 能缓存吗?
答:PHP 本身不支持,但是 apc,xcache 等加速器实现了。
- PHP 是弱类型语言。C、Java 是强类型语言
1.1.2. echo & print & printf & sprintf & var_dump & print_r
- echo
输出函数,是命令,不能返回值。echo 后面可以跟很多个参数,之间用分号隔开。 echo 比 print 稍快,因为它不返回任何值
- print
是函数,可以返回一个值,只能有一个参数。
- printf
把文字格式化以后输出,如: $name="hunte"; $age=25; printf("my name is %s, age %d", $name, $age);
- sprintf
跟 printf 相似,但不打印,而是返回格式化后的文字,其他的与 printf 一样。
1.1.3. 单引号和双引号的区别
单引号不支持变量的解析和转义字符,而双引号可以直接解析变量和转义字符!
1.1.4. isset vs empty vs is_null
- empty
判断一个变量是否为空 null、false、00、0、’0′、』。都会返回 true。
- isset
判断一个变量是否设置 0、00、’0′、』、’ ‘、false、’false’、’null’都返回 true。 只有值為 null 的变量返回 true
- if 判断式
0、00、0.0、’0′、』、false、null 返回 false ‘00′、’0.0′、’null’、’false’、’ ‘返回 true
- is_null 判断变量是否为 NULL
is_null,我们可以把它看成是!isset,是 isset 的一个逆操作,下面一张表可以很清楚的说明他们之间的关系:
Table 1: empty vs isset vs 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 总结
- 只要变量是否为” “或者 0,或者是 false 和 null,只要是这些值 empty 都会返回 true
- isset 是判断变量是否存在,只要你这个变量不是 null 或未赋值,返回结果都是 true
- is_null 正好是 isset 的反结果
1.1.5. exit vs die
- die() 是 exit() 函数的别名。功能上,die() 就等同于 exit();
- 使用场景:
当传递给 exit 和 die 函数的值为 0 时,意味着提前终止脚本的执行,通常用 exit() 当程序出错时,可以给它传递一个字符串,它会原样输出在系统终端上,通常使用 die()
1.1.6. include vs require vs include_once vs require_once
- require will produce a fatal error (E_COMPILE_ERROR) and stop the script(致命错误)
- include will only produce a warning (E_WARNING) and the script will continue(警告)
1.1.7. stripslashes, htmlspecialchars, htmlentities, and strip_tags
- stripslashes——Un-quotes a quoted string
清理字符串中的反斜杠 \ 与之相反的是 addslashes,在字符串中的单引号('),双引号("),反斜杠(\),NULL 前面添加反斜杠。通常默认的,php 会对所有的 GET,POST 和 COOKIE 数据自动运行 addslashes()
- htmlspecialchars——Convert special characters to HTML entities
- htmlentities——Convert all applicable characters to HTML entities
- strip_tags——Strip HTML and PHP tags from a string
- Strip 去除的意思
1.1.8. return, break, and continue
- return,立即停止执行函数内部的代码,然后继续执行下面的代码
- break,立即停止执行本循环体内的所有循环,最常见的 switch 循环。
- continue 与 break 都是用于终止循环执行,所不同的是,break 是彻底终止循环体的执行,而 continue 是结束本次循环,继续下一次的循环。
1.1.9. 值传递和引用传递的区别
/** * 值传递 * @param [type] */ function add($a){ $a++; $res = $a; return $res; } $a = 100; echo $a.'<br />'; // 100 echo add($a).'<br />'; // 101 echo $a.'<br />'; // 100 /** * 引用传递 * @param [type] */ function add(&$a){ $a++; $res = $a; return $res; } $a = 100; echo $a.'<br />'; // 100 echo add($a).'<br />'; // 101 echo $a.'<br />'; // 101 // 对象的引用 class A{ var $abc="ABC"; } $b =new A(); $c =$b; // 等效于 $c=&$b; echo $b->abc;//这里输出 ABC echo "<br />"; echo $c->abc="DEF";//这里输出 ABC $b->abc="DEF"; echo "<br />"; echo $c->abc;//这里输出 DEF $d1 = clone $c; echo "<br />"; echo $d1->abc="GHI"; //这里输出 GHI $d1->abc="GHI"; echo "<br />"; echo $d1->abc;//这里输出 GHI echo "<br />"; echo $c->abc;//这里输出 DEF // 函数的引用 function &test2(){ static $b=0;//申明一个静态变量 $b=$b+1; echo $b; return $b; } $a=test2();//这条语句会输出 $b 的值 为1 echo "<br />"; $a=5; $a=test2();//这条语句会输出 $b 的值 为 2 echo "<br />"; $a=&test2();//这条语句会输出 $b 的值 为 3。将 return $b 中的 $b 变量的内存地址与 $a 变量的内存地址指向了同一个地方。 echo "<br />"; $a=5; $a=test2();//这条语句会输出 $b 的值 为 6 // 函数地址引用 function test1(&$a){ $a=$a+100; } $b=1; test1($b); echo $b;//输出101 //这里$b 传递给函数的其实是$b 的内存地址,通过在函数里改变$a 的值,就可以改变$b 的值 // 变量 $a="ABC"; $b =&$a; echo $a;//这里输出:ABC echo "<br />"; echo $b;//这里输出:ABC $b="EFG"; echo "<br />"; echo $a;//这里$a 的值变为 EFG 所以输出 EFG echo $b;//这里输出 EFG ?>
1.1.10. 构造函数 vs 析构函数
- 构造函数
- 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。
- Java、C++ 构造函数的名称与类的名称是完全相同的,PHP 语言目前普遍用法是使用 __construct() 代替。
- 构造函数不会返回任何类型,也不会返回 void。
- 析构函数
- 类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。
- Java、C++ 析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。PHP 语言普遍用法是使用 __desctruct() 代替。
- 析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。
- 试图在析构函数(在脚本终止时被调用)中抛出一个异常会导致致命错误。
1.1.11. public, protected, private and final
- public 用于声明可以外部调用类或方法
- protected 声明只能被继承子类调用
- private 用于定义私有属性或方法,仅供内部类调用
- final 指定某个类不允许被继承或者是某个方法不允许被修改
1.1.12. PHP 命令传参
// 1. 使用 $argc $argv 接受参数 echo "接收到{$argc}个参数"; print_r($argv); // 2. 使用 getopt 函数 $param_arr = getopt('name:age:');//只接受 name 和 age 两个参数 print_r($param_arr); // $ php test.php -name john // 3. 通过 php 系统定义 CLI 的常量:STDIN , STDOUT , STDERR $fs = true; $username = ''; do { if ($fs) { fwrite(STDOUT, '请输入用户名:'); $fs = false; } else { fwrite(STDOUT, '抱歉,用户名不能为空,请重新输入:'); } $username = trim(fgets(STDIN)); } while (!$username); echo '您输入的用户名是:' . $username . "\r\n";
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: 计算机书籍推荐
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论