# PHP
# 特性
- 弱类型语言
# 语法
# 文档
PHP 脚本<?php 开始,以 ?>
<?php
echo 'hello josh'
?>
# 变量
# 规范
- 变量以 $ 符号开始,后面跟着变量的名称
- 变量名必须以字母或者下划线字符开始
- 变量名只能包含字母、数字以及下划线(A-z、0-9 和 _ )
- 变量名不能包含空格
- 变量名是区分大小写的($y 和 $Y 是两个不同的变量)
- 变量在赋值时声明
# 数据类型
- String(字符串)
- Integer(整型)
- Float(浮点型)
- Boolean(布尔型)
- Array(数组)
- Object(对象)
- NULL(空值)
$x = 1.23;
$y = 2;
$z = '345';
$x1 = array(1,2,'3');
$x2 = true;
class Animal {
var $name;
function __construct($name="josh") {
$this->name = $name;
}
}
$x3 = null;
$cat = new Animal('joshwang');
echo var_dump($x);
echo var_dump($y);
echo var_dump($z);
echo var_dump($x1);
echo var_dump($x2);
echo var_dump($cat);
echo var_dump($x3);
# 作用域
使用全局变量:
$x = 1;
$y = 2;
function test() {
global $x; // 通过global关键字声明
$y = $GLOBALS['y']; // 通过$GLOBALS访问
$z = $x + $y;
echo $z;
}
test();
使用换行符:
echo PHP_EOL;
Static作用域: 当一个函数完成时,它的所有变量通常都会被删除。有时候希望某个局部变量不要被删除,需在第一次声明变量时使用 static 关键字
function myTest()
{
static $x=0;
echo $x;
$x++;
echo PHP_EOL; // 换行符
}
myTest();
myTest();
myTest();
参数作用域: 通过函数入参方式传入
function test($x) {
echo $x;
}
test(123);
# 超级全局变量
$GLOBALS // 全局变量
$_SERVER // 服务器和执行环境信息
$_REQUEST // 获取请求体参数
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION
# $_SERVER
元素/代码 | 描述 |
---|---|
$_SERVER['PHP_SELF'] | 当前执行脚本的文件名,与 document root 有关。例如,在地址为 http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将得到 /test.php/foo.bar。FILE 常量包含当前(例如包含)文件的完整路径和文件名。 从 PHP 4.3.0 版本开始,如果 PHP 以命令行模式运行,这个变量将包含脚本名。之前的版本该变量不可用。 |
$_SERVER['GATEWAY_INTERFACE'] | 服务器使用的 CGI 规范的版本;例如,"CGI/1.1"。 |
$_SERVER['SERVER_ADDR'] | 当前运行脚本所在的服务器的 IP 地址。 |
$_SERVER['SERVER_NAME'] | 当前运行脚本所在的服务器的主机名。如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定。(如: www.runoob.com) |
$_SERVER['SERVER_SOFTWARE'] | 服务器标识字符串,在响应请求时的头信息中给出。 (如:Apache/2.2.24) |
$_SERVER['SERVER_PROTOCOL'] | 请求页面时通信协议的名称和版本。例如,"HTTP/1.0"。 |
$_SERVER['REQUEST_METHOD'] | 访问页面使用的请求方法;例如,"GET", "HEAD","POST","PUT"。 |
$_SERVER['REQUEST_TIME'] | 请求开始时的时间戳。从 PHP 5.1.0 起可用。 (如:1377687496) |
$_SERVER['QUERY_STRING'] | query string(查询字符串),如果有的话,通过它进行页面访问。 |
$_SERVER['HTTP_ACCEPT'] | 当前请求头中 Accept: 项的内容,如果存在的话。 |
$_SERVER['HTTP_ACCEPT_CHARSET'] | 当前请求头中 Accept-Charset: 项的内容,如果存在的话。例如:"iso-8859-1,*,utf-8"。 |
$_SERVER['HTTP_HOST'] | 当前请求头中 Host: 项的内容,如果存在的话。 |
$_SERVER['HTTP_REFERER'] | 引导用户代理到当前页的前一页的地址(如果存在)。由 user agent 设置决定。并不是所有的用户代理都会设置该项,有的还提供了修改 HTTP_REFERER 的功能。简言之,该值并不可信。) |
$_SERVER['HTTPS'] | 如果脚本是通过 HTTPS 协议被访问,则被设为一个非空的值。 |
$_SERVER['REMOTE_ADDR'] | 浏览当前页面的用户的 IP 地址。 |
$_SERVER['REMOTE_HOST'] | 浏览当前页面的用户的主机名。DNS 反向解析不依赖于用户的 REMOTE_ADDR。 |
$_SERVER['REMOTE_PORT'] | 用户机器上连接到 Web 服务器所使用的端口号。 |
$_SERVER['SCRIPT_FILENAME'] | 当前执行脚本的绝对路径。 |
$_SERVER['SERVER_ADMIN'] | 该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值。(如:someone@runoob.com) |
$_SERVER['SERVER_PORT'] | Web 服务器使用的端口。默认值为 "80"。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。 |
$_SERVER['SERVER_SIGNATURE'] | 包含了服务器版本和虚拟主机名的字符串。 |
$_SERVER['PATH_TRANSLATED'] | 当前脚本所在文件系统(非文档根目录)的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。 |
$_SERVER['SCRIPT_NAME'] | 包含当前脚本的路径。这在页面需要指向自己时非常有用。FILE 常量包含当前脚本(例如包含文件)的完整路径和文件名。 |
$_SERVER['SCRIPT_URI'] | URI 用来指定要访问的页面。例如 "/index.html"。 |
# 魔术常量
__LINE__
: 文件中的当前行号__FILE__
: 文件的完整路径和文件名__DIR__
: 文件所在的目录__FUNCTION__
: 函数名称__CLASS__
: 类的名称__TRAIT__
: 另一种类,类似vue的mixins__METHOD__
: 类的方法名__NAMESPACE__
: 当前命名空间名称
trait示例:
class Base {
public function sayHello() {
echo 'Hello ';
}
}
trait SayWorld {
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
class MyHelloWorld extends Base {
use SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
# 常量
常量的定义是全局的
// bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
define("hello", "josh", true); // 设置大小写不敏感
echo hello;
echo Hello;
# 运算符
大多数同js运算符,以下将描述不同之处
点运算符,将字符串连接在一起
$txt1="Hello world!";
$txt2="What a nice day!";
echo $txt1 . " " . $txt2;
组合比较符,又称太空船操作符,语法格式如下:
$c = $a <=> $b;
解析如下:
- 如果 $a > $b, 则 $c 的值为 1。
- 如果 $a == $b, 则 $c 的值为 0。
- 如果 $a < $b, 则 $c 的值为 -1。
$a = 1;
$b = 2;
echo $a<=>$b; // 1
箭头运算符,用于访问非静态属性
echo obj->attr;
# 操作符
::
: 用于访问静态成员,类常量,还可以用于覆盖类中的属性和方法
# 条件语句
if ($a > 0) {
...
} elseif($a < 0) { // 和js不同之处
...
} else {
...
}
# 内置函数
# 日志方法
echo / print
- echo: 可以输出一个或多个字符串
- print: 只允许输出一个字符串,返回值总为 1
echo 1,2,3;
$x = print 1;
echo $x;
# 文件方法
dirname: 获取当前文件的目录
dirname(__DIR__);
# 字符串方法
strlen: 获取字符串长度
echo strlen('asd'); // 3
strpos: 获取字符所在位置索引
$x = strpos('asd', 'zxc');
echo var_dump($x); // false
$y = strpos('asd', 'a');
echo var_dump($y); // 0
# 数组方法
count: 返回数组长度
$x = array(1,2,3);
echo count($x);
foreach: 数组遍历,返回属性名和属性值
$arr = array("a" => 4,"b" => 5,"c" => 6);
foreach($arr as $key=>$value) {
echo $key;
echo $value;
echo PHP_EOL;
}
排序:
- sort(): 对数组进行升序排列
- rsort(): 对数组进行降序排列
- asort(): 根据关联数组的值,对数组进行升序排列
- ksort(): 根据关联数组的键,对数组进行升序排列
- arsort(): 根据关联数组的值,对数组进行降序排列
- krsort(): 根据关联数组的键,对数组进行降序排列
# 命名空间
# 概念
- 子命名空间: 与目录和文件的关系很像,如: A\B\C
- 完全限定名称: 可用于访问命名空间,任意全局类、函数或常量
# 特点
- 如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。
- 可以在同一个文件中定义不同的命名空间代码
# 用法
// test.php
<?php
namespace MyProject\subnamespace;
const CONNECT_OK = "const ok";
function test() {
echo "test";
}
class Test {
static function say() {
echo "say it";
}
}
?>
// index.php
<?php
namespace MyProject;
include 'test.php';
echo "start";
echo PHP_EOL;
const test = 123;
echo test; // 非限定名称
echo PHP_EOL;
subnamespace\test(); // 限定名称, 指定下一级命名空间
echo PHP_EOL;
echo subnamespace\CONNECT_OK;
echo PHP_EOL;
echo \MyProject\subnamespace\Test::say(); // 完全限定名称,指定完整命名空间
echo PHP_EOL;
?>
使用use
操作符实现别名
<?php
namespace MyProject;
include 'util/test.php';
use \MyProject\subnamespace as sub, \MyProject\subnamespace\Test;
echo sub\CONNECT_OK;
echo PHP_EOL;
$test = new Test();
$test::say();
echo PHP_EOL;
?>
# 面向对象
同Typescript
- final: 如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。
- parent: 通过该保留字访问父类