PHP 标记
- <?php 开头, ?>结尾,经常的时候 ?> 省略。
- 当文件是纯PHP代码的时候,不建议使用结束标签?>
- 当文件是PHP代码和HTML代码混合的时候,PHP结束标签?>不允许省略
PHP 中的注释
PHP 中的大小写敏感问题
- 所有用户定义的函数、类和关键词(例如 if、else、echo 等等)都对大小写不敏感
- 所有变量都对大小写敏感
PHP 变量规则
- 变量以 $ 符号开头,其后是变量的名称
- 变量名称必须以字母或下划线开头,不能以数字开头(java也是这样)
- 变量名称只能包含字母数字字符和下划线(A-z、0-9 以及 _)
- 变量名称对大小写敏感($y 与 $Y 是两个不同的变量)
PHP 语言类型
- 首先PHP是一门弱类型语言,我们定义变量时候我们不必告知php的数据类型
- C 和 C++ 以及 Java 之类的语言中,程序员必须在使用变量之前声明它的名称和类型。
编程语言概念性知识-小结
1. 什么是静态语言,什么是动态语言?
静态语言(强类型语言): 指在编译变量的阶段,就可以确定变量的数据类型的语言,绝大多数静态语言要求变量在定义时必须明确给 出它的数据类型 例如:C、C++、C#、Java
动态语言(弱类型语言): 指在运行阶段才会确定数据的基本类型。变量在使用前不需要加上它的数据类型 例如:JS、PHP、Python、Ruby
2. 什么是强类型语言,什么是弱类型语言?
强类型语言: 一个变量一旦确定了数据类型,除非强制转换否则数据类型保持不变
弱类型语言: 通常不必在意变量的数据类型
3. 什么是解释性语言,什么是编译性语言?
编译性语言: 程序完成后,由编译器先进性编译,将代码转成机器码最终编译这个文件,可以生成可执行文件在操作系统上执行。一次编译,然后运行 例如:C、C++
解释性语言:
程序完成后,由解释器一行一行逐条运行。 例如:PHP、Python半编译性半解释性语言: java既不是编译性语言也不是解释性语言。 它的运行过程如下,首先由编译器编译成 .class 字节码文件,然后在JVM上读取.class 文件,读取一行解释一 行最后执行。 所以说 Java 的跨平台性完全就是JVM的功劳,java对不同的操作系统有不同的JVM,这就是java的跨平台性 例如: Java 、C#
PHP 变量作用域
- local(局部作用域)
- global(全局作用域)
- static(静态作用域)
1. 全局作用域和局部作用域
<?php
// error_reporting(E_ALL ^ E_NOTICE);//显示除去 E_NOTICE 之外的所有错误信息
$x=5; // 全局作用域
function myTest()
{
$y = 10; // 局部作用域
echo "函数内部: <br>";
echo "x = " . $x . "<br> y = " . $y . "<br>";
}
myTest();
echo "函数外部: <br>";
echo "x = " . $x . "<br> y = " . $y . "<br>";
运行结果
如果没有关闭notice提醒,会在第9行和第15行显示未定义的变量。关闭后
这是因为,在函数内部我们访问不到外部的变量,而在外部我们也无法访问内部的变量。
很多编程语言都是如此,
此时我们不开心如果我就要在函数内部访问到 $Xx 这个变量呢?
<?php
$x = 5; // 全局作用域
function myTest()
{
global $x;
$y = 10; // 局部作用域
echo "函数内部: <br>";
echo "x = " . $x . "<br> y = " . $y . "<br>";
}
myTest();
echo "函数外部: <br>";
echo "x = " . $x . "<br> y = " . $y . "<br>";
运行结果
我们仅仅是在第5行声明了$x 这个变量是 global的,同理我们如果想要在函数外部访问到 $y 变量
<?php
$x = 5; // 全局作用域
function myTest()
{
global $x, $y;
$y = 10; // 局部作用域
echo "函数内部: <br>";
echo "x = " . $x . "<br> y = " . $y . "<br>";
}
myTest();
echo "函数外部: <br>";
echo "x = " . $x . "<br> y = " . $y . "<br>";
运行结果
其实,除了这些我们还可以在 $GLOBALS[index] 的数组中存储了所有的全局变量。下标存有变量名。这个数组在函数内也可以访问,并能够用于直接更新全局变量。
<?php
error_reporting(E_ALL ^ E_NOTICE);//显示除去 E_NOTICE 之外的所有错误信息
$x = 5;
$y = 10;
function myTest()
{
echo 'x = ' . $GLOBALS['x'] . '<br>';
echo 'y = ' . $GLOBALS['y'] . '<br>';
}
myTest();
$GLOBALS['x'] = 1;
$GLOBALS['y'] = 2;
echo 'x = ' . $GLOBALS['x'] . '<br>';
echo 'y = ' . $GLOBALS['y'] . '<br>';
运行结果
我们可以看到 $GLOBALS[‘变量名称’] 可以做到以下两点。
a. 访问到所有的全局变量
b. 对其中任意一个全局变量的值进行更改
此时我产生了好奇,我想看看$GLOBALS这个PHP数组,里面存放那些东西
<?php
echo "<pre>";
print_r($GLOBALS);
echo "</pre>";
结果如下:
Array ( [_GET] => Array( ) [_POST] => Array( ) [_COOKIE] => Array( ) [_FILES] => Array( ) [_ENV] => Array( ) [_REQUEST] => Array( ) [_SERVER] => Array ( [PATH] => C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NGX;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;D:\app\17441\product\11.2.0\dbhome_1\bin;D:\app\17441\product\11.2.0\dbhome_1\BIN;F:\QQ\Tencent\QQ\Bin;F:\wamp\bin\mysql\mysql5.7.24\bin;F:\wamp\bin\php\php7.3.1;F:\nodejs\;F:\composer;F:\nodejs\node_global;F:\phpStudy\PHPTutorial\MySQL\bin;F:\phpStudy\PHPTutorial\php\php-7.2.1-nts;F:\phpStudy\PHPTutorial\php\php-7.2.1-nts\ext;D:\mingw64\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\ProgramData\ComposerSetup\bin;F:\Git\bin;F:\Git\cmd;C:\Users\17441\AppData\Local\Microsoft\WindowsApps;C:\Users\17441\AppData\Local\GitHubDesktop\bin;C:\Users\17441\AppData\Roaming\Composer\vendor\bin;D:\Bandizip\;C:\Users\17441\AppData\Roaming\npm;F:\Microsoft VS Code\bin;C:\Users\17441\AppData\Local\Microsoft\WindowsApps [SYSTEMROOT] => C:\WINDOWS [COMSPEC] => C:\WINDOWS\system32\cmd.exe [PATHEXT] => .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
[WINDIR] => C:\WINDOWS
[PHP_FCGI_MAX_REQUESTS] => 1000
[PHPRC] => F:/phpStudy/PHPTutorial/php/php-7.2.1-nts/
[_FCGI_SHUTDOWN_EVENT_] => 2192
[SCRIPT_NAME] => /numb/Basic/2020-2-26/a.php
[REQUEST_URI] => /numb/Basic/2020-2-26/a.php
[QUERY_STRING] =>
[REQUEST_METHOD] => GET
[SERVER_PROTOCOL] => HTTP/1.1
[GATEWAY_INTERFACE] => CGI/1.1
[REMOTE_PORT] => 55202
[SCRIPT_FILENAME] => F:/phpStudy/PHPTutorial/WWW/Numb/Basic/2020-2-26/a.php
[SERVER_ADMIN] => admin@php.cn
[CONTEXT_DOCUMENT_ROOT] => F:/phpStudy/PHPTutorial/WWW
[CONTEXT_PREFIX] =>
[REQUEST_SCHEME] => http
[DOCUMENT_ROOT] => F:/phpStudy/PHPTutorial/WWW
[REMOTE_ADDR] => 127.0.0.1
[SERVER_PORT] => 80
[SERVER_ADDR] => 127.0.0.1
[SERVER_NAME] => 127.0.0.1
[SERVER_SOFTWARE] => Apache/2.4.23 (Win32) OpenSSL/1.0.2j mod_fcgid/2.3.9
[SERVER_SIGNATURE] =>
[SystemRoot] => C:\WINDOWS
[HTTP_ACCEPT_LANGUAGE] => zh-CN,zh;q=0.9,en;q=0.8
[HTTP_ACCEPT_ENCODING] => gzip, deflate, br
[HTTP_REFERER] => http://127.0.0.1/numb/Basic/2020-2-26/
[HTTP_SEC_FETCH_USER] => ?1
[HTTP_SEC_FETCH_MODE] => navigate
[HTTP_SEC_FETCH_SITE] => same-origin
[HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
[HTTP_SEC_FETCH_DEST] => document
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36
[HTTP_UPGRADE_INSECURE_REQUESTS] => 1
[HTTP_CACHE_CONTROL] => max-age=0
[HTTP_CONNECTION] => close
[HTTP_HOST] => 127.0.0.1
[FCGI_ROLE] => RESPONDER
[PHP_SELF] => /numb/Basic/2020-2-26/a.php
[REQUEST_TIME_FLOAT] => 1582802021.9788
[REQUEST_TIME] => 1582802021
)
[GLOBALS] => Array
RECURSION
)
2. static 静态作用域
先理解下面运行的代码
<?php
function num()
{
$a = 0;
echo 'num() 中 a = ' . $a . ' <br>';
$a++;
}
num();
num();
num();
echo '<hr>';
function num2()
{
static $a = 0;
echo 'num2() 中 a = ' . $a . ' <br>';
$a++;
}
num2();
num2();
num2();
运行结果
分析: 没用static修饰的变量:每次没有累加 用了static修饰的变量:每次都进行了累加
我们可以得出第一个结论:static可以在函数被重复调用的时候,static变量保留上次执行函数后的结果。
为什么会这样?
**
静态变量: 首先静态变量属于静态存储方式,在内存的静态数据区被分配存储单元。这个区域的数据在程序运行的整个期间,都会占用分配的存储单元(内存地址在此期间不变),直到程序运行结束才会释放占用的存储单元。
我们稍微调整一下代码
<?php
$a = 0;
function num()
{
global $a;
echo 'num() 中 a = ' . $a . ' <br>';
$a++;
}
num();
num();
num();
运行结果
这也说明了一个问题:**所有的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量。
关于静态变量的小结
- 我们之所以称之为静态变量,是因为这个变量直到程序运行结束时都会保持最新的值
- 所有的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量。
- 属于静态存储方式的变量不一定就是静态变量。 例如:外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。
- 全局变量和静态变量都是属于静态存储方式
PHP 中的打印输出
1. echo
- 作用是输出一个或多个字符串,并不会自动换行。
- echo 不是一个函数而是一个语言结构
- 并且没有返回值
- 大小写不敏感
- 可以与三目运算符结合
- 可以带括号也可以不带括号,可以单引号包裹也可以双引号包裹。
- 快捷用法<?= $foo ?>,php.ini 里面启用 short_open_tag 才有效。我个人并不喜欢
- 另外记住 echo 不能打印数组
<?php
$a = 2;
$b = 1;
echo $a > $b ? 'a > b <br>' : 'a <= b <br>';
ECHO $a > $b ? 'a > b <br>' : 'a <= b <br>';
EchO $a > $b ? 'a > b <br>' : 'a <= b <br>';
2. print_r
- 打印变量易于理解的信息
- 除基本的 integer float string 可以按照键值对的形式规范的打印数组
- 有两个参数,第二个参数是一个可选参数[, bool
$return
]. 这个参数默认是false,如果设置为true,将不会打印变量的信息,而是将打印的信息当做是一个string类型的字符串传递。
<?php
$b = array('m' => 'monkey', 'foo' => 'bar', 'x' => array('x', 'y', 'z'));
echo '----1 <br>';
print_r($b, true);
echo '----2 <br>';
print_r($b, false);
echo '<br> ----3 <br>';
$res = print_r($b, true);
echo $res;
var_dump($res);
运行结果
3. print
- print 也是语言结构,它不是函数
- 和 echo 最主要的区别: print 仅支持一个参数,并总是返回 1。
- 同样大小写不敏感
- 不可以打印数组中的内容
- 和 echo 类似,有返回值所以速度慢一点
```php
<?php
$arr = [‘a’, ‘b’, ‘c’];
print(“Hello World
“); print “Hello World
“; print ‘Hello World
‘; print ‘Hello World
‘; $res = print ‘Hello World
‘; print $res . ‘
‘; print $arr . ‘
‘; echo $arr . ‘
‘;
// 结果如下 Hello World Hello World Hello World Hello World Hello World 1 Array Array
<a name="ZGejP"></a>
#### 4. var_dump
- 输出查看变量用的函数
- 可以显示变量的具体信息,如数据类型和长度
- 非常常用的一种
- 同样的大小写不敏感
- 没有返回值
```php
<?php
$arr = ['a', 'b', 'c'];
var_dump($arr);
Var_dump($arr);
// 运行结果
F:\phpStudy\PHPTutorial\WWW\Numb\Basic\2020-2-26\a.php:82:
array (size=3)
0 => string 'a' (length=1)
1 => string 'b' (length=1)
2 => string 'c' (length=1)
F:\phpStudy\PHPTutorial\WWW\Numb\Basic\2020-2-26\a.php:83:
array (size=3)
0 => string 'a' (length=1)
1 => string 'b' (length=1)
5. var_export
- 输出或返回一个变量,用字符串表示
- 和 print_r 类似,同样有第二个可选参数, 默认false ,若果设置为true则不会打印,将结果传递给返回值
<pre>
<?php
$a = array(1, 2, array("a", "b", "c"));
echo '----1----<br>';
var_export($a);
echo '<hr>----2----<br>';
var_export($a, true);
echo '<hr>----3----<br>';
var_export($a, false);
echo '<hr>----4----<br>';
$a = var_export($a, true);
var_export($a);
?>
</pre>
// 运行结果
----1----
array (
0 => 1,
1 => 2,
2 =>
array (
0 => 'a',
1 => 'b',
2 => 'c',
),
)
----2----
----3----
array (
0 => 1,
1 => 2,
2 =>
array (
0 => 'a',
1 => 'b',
2 => 'c',
),
)
----4----
'array (
0 => 1,
1 => 2,
2 =>
array (
0 => \'a\',
1 => \'b\',
2 => \'c\',
),
)'