PHP 的特点
特点1:解释型语言
PHP 是解释型语言,不需要事先被翻译为机器码
特点2:弱类型语言
PHP 是弱数据类型语言,不必声明变量的数据类型,会根据变量的值,自动把变量转换为正确的数据类型
PHP与HTML混编
代码示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>这是个php文件</title>
<style>
h1{
width: 200px;
border: 3px solid gold;
text-align: center;
}
</style>
<script>
alert('OK');
</script>
</head>
<body>
<?php
for ($i=0; $i<10; $i++){
echo "<h1>hello-$i</h1>";
}
?>
</body>
</html>
内存分析
流程分析
1.浏览器将请求发给apache
2.apache
检测请求,若后缀名是.php
,就去调用php处理模块
,该模块将全部php代码读入模块内处理
3.php处理模
块根据标记,仅处理php代码,处理结束将代码重新封装交给apache
4.apache
将代码交给浏览器,浏览器拿到的是处理后的代码,是看不到php源代码的
5.浏览器解析代码,展示给用户
编程语言的分类
翻译器
计算机不能直接理解任何除机器语言以外的语言,所以必须要把程序员所编写的语言翻译成机器语言,计算机才能执行程序。程序语言翻译成机器语言的工具,被称为翻译器。
由此可见,所谓的“翻译”,指的是翻译成计算机能够执行的指令。
翻译器翻译的方式有两种:一种是编译,另一种是解释。两种方式之间的区别在于翻译的时机不同。
-
编译器:在代码执行之前,事前把所有的代码一次性翻译好,生成中间代码文件,然后整体执行。
-
解释器:边翻译,边执行(在代码执行时进行及时翻译,并立即执行)。当编译器以解释的方式运行时,也称之为解释器。
对应的语言,称之为“编译型语言”、“解释型语言”。
编译型语言
-
定义:事先把所有的代码一次性翻译好,然后整体执行。
-
优点:运行更快。
-
不足:移植性不好,不跨平台。
-
编译型语言举例:c、c++
比如说,c语言的代码文件是.c
后缀,翻译之后文件是.obj
后缀,系统执行的是 obj 文件;再比如, java 语言的代码文件是.java
后缀,翻译之后的文件是.class
后缀。(注意,Java 语言不是严格的 编译型语言,这个一会儿会讲)
解释型语言
-
定义:边翻译边执行(翻译一行,执行一行),不需要事先一次性翻译。
-
优点:移植性好,跨平台。
-
缺点:运行更慢。
-
解释型语言举例:JavaScript、php、Python。
Java语言
Java 语言既不是编译型语言,也不是解释型语言。翻译过程:
-
编译:
.java
代码文件先通过 javac 命令编译成.class
文件。 -
执行:
.class
文件再通过 jvm 虚拟机,解释执行。有了 jvm 的存在,让 java 跨平台了。
PHP数据类型
- 基本数据类型:整形 浮点型 字符串 布尔
- 复合数据类型:数组 对象
- 特殊数据类型:资源 NULL
PHP定义变量
- php如果只是声明,但是没有定义,会报undefind,如
$a
- js中也是这样,但强类型语言不是
- php中普通变量名
php变量命名规范
- php变量前面必须加上
$
符号 - php变量区分大小写,函数不区分大小写
php表达式
- 在PHP中,几乎所写的任何东西都是一个表达式
- 简单但却最精确的定义一个表达式的方式就是“任何有值的东西”
$a = 10; // 表达式 10返回给$a
$b = 10*2; // 表达式 先运算在返回给$b
function test(){
}
$c = test(); // 表达式 返回值为null
var_dump($c);
PHP动态变量名
- php中变量名,常量名,函数名,类名是可变的
- 遇到$变量名(),php会解析变量,然后调用函数
// 动态变量名
$animal = "动物";
$dog = "animal";
$hsq = "dog";
echo $animal, $$dog, $$$hsq; //动物动物动物
// 动态常量名
define("PI", 3.14);
$test = 'PI';
echo constant($test);
// 动态函数名
function dance(){
echo '跳舞';
}
$test = 'dance';
$test();
PHP是以文件整体来执行的
php是以文件作为整体来执行的,如果如果进入代码区时发现有语法错误,会报错,且不输出任何数据
// 直接报错,不输出任何数据
$a = 111;
function test(){
echo 'hello'
}
$b = 222;
PHP变量作用域
内存角度
- 如果没有变量指向数据,那数据就销毁(除了超全局和静态)
- 局部变量,如果不人为unset()的话,函数调用结束,为函数开辟的栈销毁,原本函数栈中变量指向的数据不在有变量指向,也随之销毁
- 全局变量,如果不人为unset()的话,脚本执行完毕主栈才销毁,主栈销毁,原本主栈中变量指向的数据不在有变量指向,也随之销毁
- 超全局变量,与全局的区别就是即使在函数内,也可以直接用,无需global
概念角度
- 局部变量:函数内部有效
- 全局变量:在函数外部有效(在函数内部通过global访问)
- 超全局变量:在一个脚本的全部作用域中都可用,在函数或方法中无需执行 global 就可以访问
代码示例
// 全局变量
$a = 1;
function test(){
// 局部变量
$b = 2;
// 在函数内使用全局变量
global $a; // 等价于 $a=&$GLOBAL[$a] ,此时主栈和新栈都有一个$a 指向同一个数据
// 函数内直接使用超全局变量
var_dump($GLOBALS);
// 函数内利用超全局变量访问全局变量
echo $GLOBALS[$a];
}
test();
为什么PHP函数可以在定义声明前就能调用?PHP程序的执行不是从上到下的吗?函数全局性的基本原理是什么?
首先PHP不是单纯的按照行来边解释边执行的,而是先由Zend引擎翻译PHP代码到Zend二进制操作码,然后再去执行操作码。
对于函数的位置,因为函数的作用域是全局的,所以只要定义了,那么就可以在任意位置去调用它。
PHP 中的所有函数和类都具有全局作用域,可以定义在一个函数之内而在之外调用,反之亦然。(348讲)
348讲解释: php在执行的时候,是以文件为单位执行,也就是说,在执行php代码时,整个文件已经被调入内存