英文博客专栏 PHP 疾速入门
引言
本文是对于英文原始博客的一个 PHP 入门专栏的集体笔记摘录,因为十分入门并且本身有 JAVA 语言根底,看的比拟快并且会疏忽很多共同点,倡议读者有能力能够看看博客的原文顺带晋升英文能力,作者文字表达能力十分强,写的十分棒。
这篇专栏介绍了 PHP8 入门,专栏写于 2022 年中旬,不论是单词还是语法句式都非常通俗易懂,学技术的同时晋升英语水平并且有助于晋升自信心。
目录
- 介绍
- 过往历史
- php 是一个怎么样的语言
- 设置 PHP
- 第一个 PHP 程序
- 根本类型
-
操作符
- 字符串操作
- 编写正文
- 和数字无关的内置函数
-
Array 数组
- arrays 罕用函数
- 关联数组
- 条件语句
- 循环
-
函数
- 匿名函数
- 值传递和地址传递
- 箭头函数
- 应用 map,reduce,filter 函数循环数组解决
-
面向对象
- 面向对象探讨
- 如何构建对象
- 属性和办法
- 继承
- 重写
- 动态
- 对象比拟
- 对象遍历
- 对象克隆
- 魔术办法
- 文件蕴含
- 文档零碎的有用常量、函数和变量
- 谬误
- 异样
- 日期
- 常量和枚举
-
PHP web 平台部署
- 解决 HTTP 申请
- $\_SEVER 对象
- 应用 cookies
- Sessions
- IO
- database
- JSON
- Composer
- 部署 PHP 利用
原始博客地址
https://thevalleyofcode.com/php/
介绍
PHP 是一个两级分化的语言,感觉它好的人称誉它简略,PHP 的语法比拟自在上手非常简单。而不好的人则会像我一样认为是个 四不像 语言,既有前端脚本的影子,然而同时反对面向对象的形式组合代码,总是会有种奇怪的感觉。
然而不得不抵赖,世界上绝大多数 WEB 网站都是 PHP 构建的,PHP 是 web 畛域当之无愧的佼佼者。尽管这语言当初在国内是一潭死水,然而在国外它是能排进前十的热门编程语言。
PHP 在短短的几年内疾速倒退,从最开始几年的 PHP4 和 PHP5 的收缩,到当初 PHP8 的版本公布,更新迭代的速度还是很快的。
过往历史
PHP 起源于 1994 年的集体博客网站,作者是 rasmus lerdorf,PHP 在 1997 到 2000 随着互联网的疾速崛起并且爆炸式增长。
用处:
- 和 HTML 存在一点点交互动静的 HTML 语言,以及 web 应用程序当中对外提供拜访。
- Facebook 就是构建在 PHP 网站之上的,晚期微微博也同样用的 PHP 语言
- wiki 百科同样应用 PHP 构建
PHP 是一个怎么样的语言
尽管 PHP 被戏称脚本语言,然而实际上它是解释型语言,和宽广编译运行的服务端语言没什么区别。只不过和其余大部分解释型语言不同点是 PHP不须要编译 就能够运行,或者能够认为编译的动作自身就是 主动 的。这和 Java,GO 以及 c 语言等等都有很大不同。在 JAVA 畛域 PHP 十分像 JSP,然而理论比照会发现要比 JSP 更灵便和不便,也更好用。
这个语言外部可主动通过编译器把代码翻译成机器能够意识以及能够运行的语言。
从集体角度看 PHP 被称作脚本语言是比拟适合的词,因为它在 web 畛域蛟龙得水。此外因为 PHP 是动静类型语言,开发者不须要关注变量类型,然而有时候又因为类型转化的问题呈现一些难以觉察的谬误。
动静类型语言是高级编程语言的趋势这一点毋庸置疑。就连 JDK11 也实现了 var 关键词的动静类型语法糖定义就能够看出端倪。
最初用作者的原文总结:PHP 是一门很像 JavaScript 的语言,不同的是它有动静类型,灵便类型的解释型 后端 语言。
设置 PHP
本局部作者介绍了 mamp 的装置应用,集体没有应用教训就不具体记录了,对于 PHP 作者举荐应用 VScode 编辑器开发,集体应用下来发现的确好用,当然 Jerbrian 的 PHP IDE 也不错,对于长年应用 IDEA 的开发人员根本能够无缝连接。
PHP 开发个别依赖 套件 ,PHP 自身就是起源于集体博客专职于 WEB Application 畛域,所以他须要最为基本的软件比方Apach,Mysql,Redis 等等。
PHP 开源套件软件很多,这里就不过多开展了。当然套件开发不是强制的,当然开发者开发过程中也能够独自部署中间件和数据库。
对于 php 的 web 利用,必备组件无外乎上面几个:
- PHP 语言环境变量,举荐最新版的 PHP8。
- 数据库,通常以 MySQL 为主。
- apache 或者 nignix 作为 web 服务器。
PHP 是面向 http web 利用程序开发语言,很多时候都须要和 HTML 页面配合,这和古老的 JSP 语言有点相似,然而理论应用的时候更多是和模板引擎以及框架配合。
第一个 PHP 程序
PHP 的 Helloworld 非常简单,只须要在 mamp 或者其余 PHP 程序的开发软件根目录创立 index.html
的文件即可。很多 web server 服务器根本都应用 index.html 作为默认的拜访页面,所以如果间接拜访 localhost 端口的 webserver 根门路,那么就会展现对应 index.html
页面。
PHP 代码通常以及 <?php
结尾以及 ?>
结尾,两头编写无关 PHP 语言代码即可,咱们能够在 index.html
文件全文替换成上面的代码。
<?php
echo 'World';
?>
尽管拜访的是 html 页面,然而外面的 PHP 代码却会被辨认翻译并且执行。
根本类型
PHP 是动静类型语言,定义变量形式如下:
<?php
$a = 5;
$b = '444';
?>
PHP 反对上面的根底类型:
bool
boolean values (true/false)int
integer numbers (no decimals)float
floating-point numbers (decimals)string
stringsarray
arraysobject
objectsnull
a value that means“no value assigned”
如果要晓得变量的数据类型,能够应用 var_dump()
的办法查看:
$age = 20;
var_dump($age);
操作符
PHP 的根底操作符:
算数操作:+
, -
, *
, /
(division), %
(remainder) and **
(exponential).
赋值操作:=
比拟操作:<
, >
, <=
, >=
,此外还有相等和全等操作,含意和 JS 的相似,相等能够类型不匹配比方 5==’5’,全等类型必须统一,比方 5 ===’5’ 就是 false。
==
returns true if the two operands are equal.===
returns true if the two operands are identical.
和比拟操作相同的有!== 以及!= 符号。
自增操作:++ 和 – – 操作。
特殊符号:think new lines \n
or tabs \t
拼接操作:PHP 和其余语言比拟大的区别,那就是相似字符串拼接用的是“.”
$fullName = $firstName . ' ' . $lastName;
字符串操作
字符串的操作和其余后端语言相似,上面简略列举博客中的一些试验,这里间接上代码就不过多解释了:
$name = 'Flavio';
strlen($name); //6
$name = 'Flavio';
substr($name, 3); //"vio" - start at position 3, get all the rest
substr($name, 2, 2); //"av" - start at position 2, get 2 items
$name = 'Flavio';
str_replace('avio', 'ower', $name); //"Flower"
$name = 'Flavio';
$itemObserved = str_replace('avio', 'ower', $name); //"Flower"
- trim()”) strips white space at the beginning and end of a string
- strtoupper()”) makes a string uppercase
- strtolower()”) makes a string lowercase
- ucfirst()”) makes the first character uppercase
- strpos()”) finds the firsts occurrence of a substring in the string
- explode()”) to split a string into an array
- implode()”) to join array elements in a string
编写正文
编写正文的办法如下:
// single comment
/*
this is a comment
*/
//or
/*
*
* this is a comment
*
*/
//or to comment out a portion of code inside a line:
/* this is a comment */
和数字无关的内置函数
作者当时列举一些和数字或者数学计算无关函数:
- round()”) to round a decimal number, up/down depending if the value is > 0.5 or smaller
- ceil()”) to round a a decimal number up
- floor()”) to round a decimal number down
- rand()”) generates a random integer
- min()”) finds the lowest number in the numbers passed as arguments
- max()”) finds the highest number in the numbers passed as arguments
- is\_nan()”) returns true if the number is not a number
Array 数组
数组定义能够用方括号或者 array 函数,数组能够当做其余编程语言的列表(容器)对待,不须要定义长度并且容量主动增长。
列表外面的元素类型能够不统一,甚至元素能够是另一个列表。
// 数组定义
$list = [];
$list = array();
// 初始化定义
$list = [1, 2];
$list = array(1, 2);
$list = ['a', 'b'];
$list[0]; //'a' --the index starts at 0
$list[1]; //'b'
$list = [1, [2, 'test']];
增加元素能够应用空方括号的形式设置值,这时候参数会主动在开端追加。
$list = ['a', 'b'];
$list[] = 'c';
/*
$list == [
"a",
"b",
"c",
]
*/
应用array\_unshift 增加元素到列表头部:
$list = ['b', 'c'];
array_unshift($list, 'a');
/*
$list == [
"a",
"b",
"c",
]
*/
应用 count 函数计算数组的元素数量:
$list = ['a', 'b'];
count($list); //2
查看元素是否在数组,应用in\_array 函数 \`:
$list = ['a', 'b'];
in_array('b', $list); //true
arrays 罕用函数
罕用函数依据作者笔记记录即可。
is_array()
to check if a variable is an arrayarray_unique()
to remove duplicate values from an arrayarray_search()
to search a value in the array and returns the keyarray_reverse()
to reverse an arrayarray_reduce()
to reduce an array to a single value using a callback functionarray_map()
to apply a callback function to each item in the array. Typically used to create a new array by modifying the values of an existing array, without altering that.array_filter()
to filter an array to a single value using a callback functionmax()
to get the maximum value contained in the arraymin()
to get the minimum value contained in the arrayarray_rand()
to get a random item from the arrayarray_count_values()
to count all the values in the arrayimplode()
to turn an array into a stringarray_pop()
to remove the last item of the array and return its valuearray_shift()
same asarray_pop()
but removes the first item instead of the lastsort()
to sort an arrayrsort()
to sort an array in reversing orderarray_walk()
similarly toarray_map()
does something for every item in the array, but in addition it can change values in the existing array
关联数组
到目前为止,咱们曾经应用了带有增量数字索引的数组:0、1、2… 您还能够应用带有命名索引(键)的数组,咱们称它们为关联数组:
$list = ['first' => 'a', 'second' => 'b'];
$list['first'] //'a'
$list['second'] //'b'
能够通过关联数组进行标记 key 以及 value,关联数组同样有比拟多的操作方法:
array_key_exists()
to check if a key exists in the arrayarray_keys()
to get all the keys from the arrayarray_values()
to get all the values from the arrayasort()
to sort an associative array by valuearsort()
to sort an associative array in descending order by valueksort()
to sort an associative array by keykrsort()
to sort an associative array in descending order by key
在此处查看所有有关联数组函数:https://www.php.net/manual/en/ref.array.php
条件语句
条件语句的最根底用法:
$age = 17;
if ($age > 18) {echo 'You can enter the pub';} else {echo 'You cannot enter the pub';}
这里用了 cannot 而不是 can’t 是因为单引号嵌套会呈现“截断”导致报错,须要单引号外部嵌套须要应用本义符 \
反斜杠。
<
, >
, <=
, >=
, ==
, ===
, !=
, !==
这些符号在理论应用和条件语句一起应用:
这里须要留神 PHP 提供了专门的 elseif,而不能像其余语言一样应用 else[空格]if
的语法:
$age = 17;
if ($age > 20) {echo 'You are 20+';} elseif ($age > 18) {echo 'You are 18+';} else {echo 'You are <18';}
Swtich 的语法和其余编程语言是统一的:
$age = 17
switch($age) {
case 15:
echo 'You are 15';
break;
case 16:
echo 'You are 16';
break;
case 17:
echo 'You are 17';
break;
case 18:
echo 'You are 18';
break;
default:
echo "You are $age";
}
循环
PHP 的循环语句语法有 while
, do while
, for
, and foreach
,while
和do while
的办法和大部分编程语言没什么不同。
$counter = 0;
while ($counter < 10) {
echo $counter;
$counter++;
}
$counter = 0;
do {
echo $counter;
$counter++;
} while ($counter < 10);
次要差异是 foreach
语法,能够用他遍历列表,也能够用来遍历列表获取索引,也就遍历关联数组的 key/value
值。
$list = ['a', 'b', 'c'];
foreach ($list as $value) {echo $value;}
$list = ['a', 'b', 'c'];
foreach ($list as $key => $value) {echo $key;}
对于一般 for 循环,能够应用 count 函数计算数组长度的 size。
$list = ['a', 'b', 'c'];
for ($i = 0; $i < count($list); $i++) {echo $list[$i];
}
//result: abc
和循环搭配应用的 break 和 continue 语法:
$list = ['a', 'b', 'c'];
for ($i = 0; $i < count($list); $i++) {if ($list[$i] == 'b') {break;}
echo $list[$i];
}
// result a
$list = ['a', 'b', 'c'];
for ($i = 0; $i < count($list); $i++) {if ($list[$i] == 'b') {continue;}
echo $list[$i];
}
//result: ac
函数
PHP 函数的次要特点:
- PHP 的函数只反对单返回值。
- 如果没有返回值或者省略则接管为 null,留神这里是有陷阱的,如果调用一个无返回值的办法,会取得 null 的后果,PHP 并不会对此报错。
- 参数能够等号设置默认值。
- 能够指定参数类型,也能够省略,省略会主动依据上下文猜想类型。
function sendEmail($to) {echo "send an email to $to";}
sendEmail('test@test.com');
// result: send an email to test@test.com
能够手动指定参数的类型,当然绝大多数状况下不会这样写(很啰嗦还浪费时间),所以看一下就能够间接遗记:
function sendEmail(string $to, string $subject, string $body) {//...}
PHP 函数的参数反对定义的时候指定默认值,如果调用方没有传值就应用默认值:
function sendEmail($to, $subject = 'test', $body = 'test') {//...}
sendEmail('test@test.com')
带返回值的函数定义如下,咱们同样能够手动指定函数的返回值类型:
function sendEmail($to): bool {return true;}
function sendEmail($to) {return true;}
$success = sendEmail('test@test.com');
if ($success) {echo 'email sent successfully';} else {echo 'error sending the email';}
匿名函数
PHP 的匿名函数和 JavaScript 的写法是相似的,应用变量接管不带名字的 function
办法,因为不带返回值的函数默认返回 Null,所以能够认为匿名函数的变量就是 Null。
匿名函数是反对变量传递的,语法是在匿名办法前面追加 use 和括号。
$test = 'test';
$myfunction = function() use ($test) {
echo $test;
return 'ok';
};
$myfunction()
值传递和地址传递
PHP 默认状况下的参数传递都是 值传递 ,也就是说内部的参数传递在函数外部呈现扭转是 不会 一并扭转的,因为值传递是用了一份变量正本进行数据操作。
地址传递或者说援用传递须要在参数后面加 取地址 的符号,这里的写法就相似 C 语言的指针了。
$character = 'a';
function test(&$c) {$c = 'b';}
test($character);
echo $character; //'b'
箭头函数
PHP 的箭头函数相当于 JS 的 函数式编程,和 Java 的箭头函数相似,然而箭头函数用了等号而已。
$printTest = fn() => 'test';
$printTest(); //'test'
$multiply = fn($a, $b) => $a * $b;
$multiply(2, 4) //8
后面提到过匿名函数须要应用 use
语句接管内部参数,而箭头函数就 不须要 如此定义便能够间接接管内部参数,写法不便和简洁易懂:
$a = 2;
$b = 4;
$multiply = fn() => $a * $b;
$multiply()
总之 PHP 的函数有三种定义方法,一般函数,箭头函数和匿名函数。
应用 map,reduce,filter 函数循环数组解决
array_map:函数能够对于每个元素调用回调函数并且返回后果,最初会返回一个全新的列表。首个参数是回调函数,其次是列表。
array_filter:函数则是对于每个元素调用回调函数并且过滤掉不合乎的元素,留神第一个参数是数组,而后第二个参数是回调函数,filter 是合乎函数回调后果的能够认为是无效的。
array_reduce:函数比拟非凡一些,最初有一个参数有一个初始值,函数会从初始化的值对后续的每个元素进行回调函数合并,比方计算阶乘的值就能够用这个函数。
$numbers = [1, 2, 3, 4];
$doubles = array_map(fn($value) => $value * 2, $numbers);
//$doubles is now [2, 4, 6, 8]
$numbers = [1, 2, 3, 4];
$even = array_filter($numbers, fn($value) => $value % 2 === 0)
//$even is now [2, 4]
$numbers = [1, 2, 3, 4];
$result = array_reduce($numbers, fn($carry, $value) => $carry * $value, 1)
面向对象
面向对象探讨
PHP 的面向对象和 JAVA 的比拟类似,能够说大部分语法都能够通用。
如何构建对象
构建对象在 PHP 当中也是应用 new 的形式,能够通过 new 构建多个对象,然而对象名称不能反复。
属性和办法
属性和办法经常配合应用,这里一并介绍魔术办法结构参数。办法能够指定构造函数 __construction
,其中能够增加初始化对象的行为,PHP 当中对象有很多内置函数都以 双下划线 结尾。
class Dog {
public $name;
public function __construct($name) {$this->name = $name;}
public function bark() {echo $this->name . 'barked!';}
}
$roger = new Dog('Roger');
$roger->bark();
每个类默认有一个不执行任何工作的空结构器,重写之后如果无空构造函数,须要传入指定参数能力初始化,否则会呈现 PHP 的 error 异样。
class Dog {
public string $name;
public function __construct($name) {$this->name = $name;}
public function bark() {echo $this->name . 'barked!';}
}
$roger = new Dog('Roger');
$roger->name; //'Roger'
$roger->bark(); //'Roger barked!'
// result
TypeError: Dog::__construct():
Argument #1 ($name) must be of type int,
string given on line 14
对象属性在 PHP 中存在三个限定符号,能够手动指定上面三个级别:
protected
private
public
这几个类别别离对应了继承对象可见,公有,对外公开,和 JAVA、Python 语言相似,这里就不过多扩大含意和更多用法案例了。
class Dog {
public $name;
public $age;
public $color;
}
$roger = new Dog();
$roger->name = 'Roger';
$roger->age = 10;
$roger->color = 'gray';
var_dump($roger);
/*
object(Dog)#1 (3) {["name"]=> string(5) "Roger"
["age"]=> int(10)
["color"]=> string(4) "gray"
}
*/
如果须要内部拜访,少数状况倡议用 get 和 set 的形式,对于类外部的属性首先须要定义 public,其次援用须要应用 this→xxx 的形式,留神这个 this 是不能省略的,也是和 JAVA 差异比拟大的点,而内部则为对象的变量援用设置的名称加上→符号,比方dog→bark()
$roger = new Dog('Roger');
$roger->name; //'Roger'
$roger->bark(); //'Roger barked!'
属性只有在 public 修饰符形容的状况下能力对外拜访和批改,如果为 private 或者 protected 则不行,限定符的平安拜访和 Java 的没什么区别。
办法外部的 $this 比拟非凡,代表以后对象自身援用,和后端编程语言 JAVA 等相似。
继承
PHP 的对象反对继承,具体语法如下:
class Dog extends Animal {
}
$roger = new Dog();
$roger->eat();
重写
PHP 重写和 JAVA 的规定相似,所以咱们依照 JAVA 的对象继承了解即可:
class Animal {
public $age;
public function eat() {echo 'the animal is eating';}
}
class Dog extends Animal {public function eat() {echo 'the dog is eating';}
}
动态
静态方法和动态属性都是在属性或者办法名称后面加 static。对于 static 类或者对象外部应用 self 来定义,援用形式为两个冒号,比方User::getName。
User::getName标识动态变量的写法是强制规定的,否则编译器会报错Undefined variable '$version'.intelephense(1008)
。
class Utils {public static $version = '1.0';}
// 动态常量的对象外部援用
self::$version;
// 动态常量的内部援用
class Utils {public static function version() {return '1.0';}
}
Utils::version
对象比拟
后面的操作符提到过双等号和三等号有不同的含意,对于大部分状况下对象的比拟 ==
和===
会返回 true 和 false,上面的例子就是很好的解释。
class Dog {public $name = 'Good dog';}
$roger = new Dog();
$syd = new Dog();
echo $roger == $syd; //true
echo $roger === $syd; //false
对象遍历
对象遍历通常是遍历所有的外部属性值,能够应用关联循环的写法,这个对象遍历是 PHP 的一些语法个性,算是比拟有意思的货色。
class Dog {
public $name = 'Good dog';
public $age = 10;
public $color = 'gray';
}
$dog = new Dog();
foreach ($dog as $key => $value) {echo $key . ':' . $value . '<br>';}
对象克隆
PHP 的clone
办法和 JAVA 一样属于浅拷贝,深刻拷贝须要额定编写一些代码。
class Dog {public $name;}
$roger = new Dog();
$roger->name = 'Roger';
$syd = clone $roger;
魔术办法
魔术办法能够了解为 PHP 为了不便开发者治理对象而提供的一些”切面“,开发者能够通过重写对象的特定办法管制行为:
class Dog {
public $name;
public function __clone() {$this->cloned = true;}
}
$roger = new Dog();
$roger->name = 'Roger';
$syd = clone $roger;
echo $syd->cloned;
其余的魔术办法蕴含:__call()
, __get()
, __set()
, __isset()
, __toString()
。
文件蕴含
文件蕴含的操作在 PHP 中有四种写法:include
, include_once
, require
, require_once
.
include
loads the content of another PHP file, using a relative path.
require
does the same, but if there’s any error doing so, the program halts.include
will only generate a warning.
“include”:应用相对路径加载另一个 PHP 文档的内容。
“require”:执行雷同的操作,但如果载入有任何谬误过程将进行。留神“include”只会生成正告,require 会间接抛出异样信息。
include_once
和 require_once
在没有 _once
的状况下执行与其相应函数雷同的操作,但它们额定确保在过程执行期间仅蕴含一次文件。
依照作者的教训法令是教训法令永远不要应用蕴含或要求,因为您可能会加载同一个文档 2 次,include\_once 和 require\_once 帮忙您防止此问题。
上面介绍文件蕴含的相干操作:
require_once('test.php');
//now we have access to the functions, classes
//and variables defined in the `test.php` file
require_once('../test.php');
require_once('test/test.php');
require_once('/var/www/test/file.php');
文档零碎的有用常量、函数和变量
无关文件的魔法常量:
__FILE__
还有一个和服务器无关的全局常量:
$_SERVER['SCRIPT_FILENAME']
除此之外其余的一些罕用常量或者函数:
getcwd(): 内置函数
__DIR__:另一个神奇常量
将__FILE__与 dirname()组合以取得
以后文档夹的残缺门路:dirname(__FILE__)
应用 $_SERVER[“DOCUMENT_ROOT”]
谬误
PHP 的谬误或者说异样信息分为上面三类:
- Warnings
- Notices
- Errors
后面两个谬误都是正告相似的,尽管有可能在程序运行过程中会呈现问题然而不影响程序运行,而最初一个 error 则是会由 PHP 的解释器间接返回报错信息。
默认状况下 PHP 是不展现错误信息的,咱们能够批改 \`php.ini
\` 的配置进行调整。为了更快的理解配置文件的地位和相干信息,咱们能够应用 phpinfo()办法和查看:
<?php
phpinfo();
?>
原作者案例的对应的门路为:/Applications/MAMP/bin/php/php8.1.0/conf/php.ini
,默认状况下为 off,意味着谬误将不再显示在网站中,但在这种状况下将在 MAMP(如果是别的开发脚手架则为其余的门路)的 logs 文档夹的 php\_error.log 文档中看到它们。
集体的 wampServer 的对应谬误日志信息如下:
咱们能够指定谬误日志重定向到特定的目录:
; Log errors to specified file. PHP's default behavior is to leave this value
; empty.
; http://php.net/error-log
; Example:
;error_log = php_errors.log
增加错误信息能够通过办法 error\_log(‘test’); 解决,上面截取框架的用法:
/**
* Logs user information to webserver logs.
*
* @param string $user user name
* @param string $status status message
*
* @return void
*/
public static function logUser($user, $status = 'ok')
{if (function_exists('apache_note')) {apache_note('userID', $user);
apache_note('userStatus', $status);
}
/* Do not log successful authentications */
if (! $GLOBALS['PMA_Config']->get('AuthLogSuccess') && $status == 'ok') {return;}
$log_file = self::getLogDestination();
if (empty($log_file)) {return;}
$message = self::getLogMessage($user, $status);
if ($log_file == 'syslog') {if (function_exists('syslog')) {@openlog('phpMyAdmin', LOG_NDELAY | LOG_PID, LOG_AUTHPRIV);
@syslog(LOG_WARNING, $message);
closelog();}
} elseif ($log_file == 'php') {@error_log($message);
} elseif ($log_file == 'sapi') {@error_log($message, 4);
} else {
@error_log(date('M d H:i:s') . 'phpmyadmin:' . $message . "\n",
3, $log_file
);
}
}
异样
异样通常是除开编程语言语法之外的可控谬误,PHP 和 JAVA 一样应用了 try{...}catch(Exception $e)
的形式进行解决:
try {//do something} catch (Throwable $e) {
//we can do something here if an exception happens
echo $e->getMessage();}
试验中咱们能够应用除 0 的异样查看异样信息的打印:
echo 1 / 0;
异样解决的准则是细分不同的具体异样给出不同的提醒,PHP 的异样捕捉规定和 JAVA 统一:
try {echo 1 / 0;} catch (DivisionByZeroError $e) {echo 'Ooops I divided by zero!';} catch (Throwable $e) {echo $e->getMessage();
}
PHP 同样反对 finally 的写法:
try {echo 1 / 0;} catch (DivisionByZeroError $e) {echo 'Ooops I divided by zero!';} catch (Throwable $e) {echo $e->getMessage();
} finally {echo '...done!';}
更多异样解决能够参考上面的网站:
https://www.php.net/manual/en/reserved.exceptions.php
日期
常量和枚举
咱们能够在 PHP 中应用 define()内置函数定义常量,应用语法如下:
define('TEST', 'some value');
这种常量定义在应用的时候不须要应用 $ 符号:
define('TEST', 'some value');
echo TEST;
define
相似 C 语言的 typeof。
其余定义常量的办法是 const:
const BREED = 'Siberian Husky';
第三种定义常量的办法是定义枚举:
enum Status {
case EATING;
case SLEEPING;
case RUNNING;
}
枚举常量的应用办法如下:
class Dog {public Status $status;}
$dog = new Dog();
$dog->status = Status::RUNNING;
if ($dog->status == Status::SLEEPING) {//...}
PHP web 平台部署
PHP 是一种服务器端语言,通常以 2 种形式应用。
- 第一种办法是相似 JSP 一样在 HTML 中嵌入 PHP 后端语言代码达到动态数据展现的成果。
- 第二种是 PHP 更像是负责生成“利用过程”的引擎,模板语言来生成 HTML,并且所有内容都由咱们所谓的框架治理。(举荐)
解决 HTTP 申请
本局部介绍了在没有任何框架的状况下如何接管和解决 HTTP 申请,咱们能够在 webroot 的门路创立一个 test.php 文件,此时如果对于脚手架配置伪动态,能够间接通过 /test 拜访。
WEB 利用绝大部分都是 POST 和 GET 申请,PHP 提供了$_GET
, $_POST
and $_REQUEST
这些办法
$ _GET:对于任何申请,您能够应用 $\_ GET 对象拜访所有查问字符串数据,该对象称为超全局,并在咱们所有的 PHP 文档中主动可用。
$\_ POST:对于 POST、PUT 和 DELETE 申请,更有可能须要以urlencoding
数据的模式公布的数据或应用 FormData 对象,PHP 应用$_POST
为您提供该对象。
$_REQUEST:$\_ REQUEST 囊括了下面两个魔法常量的内容。
上面的案例介绍了无关这些魔法常量的用法
if (isset($_GET['tables'])) {$constrains = $GLOBALS['dbi']->getForeignKeyConstrains($_REQUEST['db'],
$_GET['tables']
);
$response = Response::getInstance();
$response->addJSON('foreignKeyConstrains',$constrains);
}
应用 cookies$\_SEVER 对象
$_SERVER
蕴含了许多十分有用的服务器信息,咱们能够应用 Phpinfo 办法获取服务器内容:
<?php
phpinfo();
?>
上面是根本用法:
$_SERVER['HTTP_HOST']
$_SERVER['HTTP_USER_AGENT']
$_SERVER['SERVER_NAME']
$_SERVER['SERVER_ADDR']
$_SERVER['SERVER_PORT']
$_SERVER['DOCUMENT_ROOT']
$_SERVER['REQUEST_URI']
$_SERVER['SCRIPT_NAME']
$_SERVER['REMOTE_ADDR']
$\_GET 办法的应用案例如下:
<form>
<input type="text" name="name" />
<input type="submit" />
</form>
<?php
if (isset($_GET['name'])) {echo '<p>The name is' . $_GET['name'];
}
?>
$\_POST 办法的应用案例如下:
<form **method="POST"**>
<input type="text" name="name" />
<input type="submit" />
</form>
<?php
if (isset($_POST['name'])) {echo '<p>The name is' . $_POST['name'];
}
?>
这些内容间接应用的状况比拟少,通常在框架中能够看到相似的援用。
应用 cookies
PHP 通过 $_COOKIE
变量能够获取到所有和 Cookie 无关的信息。
if (isset($_COOKIE['name'])) {$name = $_COOKIE['name'];
}
setcookie()
办法能够设置 cookie 信息,咱们能够增加第三个参数来阐明 cookie 何时过期。如果省略,Cookie 将在会话完结时 / 浏览器敞开时过期。
setcookie('name', 'Flavio');
比方上面的代码能够设置 7 天之后过期:
setcookie('name', 'Flavio', time() + 3600 * 24 * 7);
咱们只能在 Cookie 中存储无限数量的数据,用户在革除浏览器数据时能够在客户端革除 Cookie。上面是 Cookie 应用的一些简略例子:
<?php
if (isset($_POST['name'])) {setcookie('name', $_POST['name']);
}
if (isset($_POST['name'])) {echo '<p>Hello' . $_POST['name'];
} else {if (isset($_COOKIE['name'])) {echo '<p>Hello' . $_COOKIE['name'];
}
}
?>
<form method="POST">
<input type="text" name="name" />
<input type="submit" />
</form>
Sessions
Cookie 的一个十分乏味的用例是基于 cookie 的会话。
<?php
session_start();
?>
你会发现拜访对应文件之后,你将会看到一个新 cookie 名称(PHPSESSID)被定义。这个 ID 就是咱们常说的session ID。
与咱们应用 cookie 的形式相似,咱们当初能够应用 $_SESSION 来存储用户发送的信息,但这次它不存储在客户端。只有 PHPSESSID 会被存储到客户端。
<?php
session_start();
if (isset($_POST['name'])) {$_SESSION['name'] = $_POST['name'];
}
if (isset($_POST['name'])) {echo '<p>Hello' . $_POST['name'];
} else {if (isset($_SESSION['name'])) {echo '<p>Hello' . $_SESSION['name'];
}
}
?>
<form method="POST">
<input type="text" name="name" />
<input type="submit" />
</form>
能够应用 session_unset()
办法删除 Session 当中的信息,如果须要移除 session 的 cookie 信息,能够应用上面的办法:
setcookie(session_name(), '');
IO
PHP 服务端拜访能够应用上面的办法:
文件是否存在file_exists()
:
file_exists('test.txt') //true
文件大小获取:
filesize('test.txt')
PHP 的文件读写应用同一个办法,不同的是提供拜访参数应用了 读模式和写模式:
$file = fopen('test.txt', 'r')
下面的办法为只读模式,同时提供形容信息作为返回值。咱们能够调用 fclose($fd)
终止文件读写。
上面是把文件内容读取到变量的办法,这里吐槽一下应用要比 JAVA 的套版代码简略很多,也比拟合乎新生高级编程语言的设计思路。
$file = fopen('test.txt', 'r')
fread($file, filesize('test.txt'));
//or
while (!feof($file)) {$data .= fgets($file, 5000);
}
留神:feof() 查看咱们是否尚未达到文档开端,因为 fgets 一次读取 5000 字节
逐行扫描文件套版代码:
$file = fopen('test.txt', 'r')
while(!feof($file)) {$line = fgets($file);
//do something
}
要写入文件,必须一开始关上文件的时候指定写入模式,同时配合 fwrite
函数以及 fclose
造成残缺的文件读写。
$data = 'test';
$file = fopen('test.txt', 'w')
fwrite($file, $data);
fclose($file);
删除文件的办法如下:
unlink('test.txt')
更多文件读写办法参考:https://www.php.net/manual/en/ref.filesystem.php
database
所有后端语言必备的货色,这里列举了几个罕用的 database:
- PostgreSQL
- MySQL / MariaDB
- MongoDB
绝大多数状况如果你须要一个数据库,你应该应用 框架或 ORM,这将节俭 SQL 注入的平安问题,比方比拟常见的 Laravel’s Eloquent 框架。
JSON
JSON 是一种可移植的数据格式,咱们用于示意数据并将数据从客户端发送到服务器。PHP 提供了上面两个罕用办法来实现 JSON 字符串和对象之间的转化:
json_encode()
to encode a variable into JSONjson_decode()
to decode a JSON string into a data type (object, array…)
上面是一些简略应用例子:
$test = ['a', 'b', 'c'];
$encoded = json_encode($test); // "["a","b","c"]" (a string)
$decoded = json_decode($encoded); // ["a", "b", "c"] (an array)
发送邮件能够应用上面的办法:
mail('test@test.com', 'this subject', 'the body');
https://github.com/PHPMailer/PHPMailer 提供了更多有邮件相干的实用 API。
部署 PHP 利用 Composer
Composer 相似 NodeJS 的 NPM,和大部分的一站式依赖治理是相似的。Composer 装置之后的页面内容如下:
能够应用 composer require nesbot/carbon
命令对于我的项目进行依赖导入。正确导入之后会呈现composer.json
以及 composer.lock
文件,composer.lock
文件能够对于依赖版本进行锁定。
{
"require": {"nesbot/carbon": "^2.58"}
}
当对应目录引入依赖之后,在 PHP 文件当中能够应用上面的用法:
<?php
require 'vendor/autoload.php';
use Carbon\Carbon;
echo Carbon::now();
最终拜访对应页面的展现内容如下:
“require ‘vendor/autoload.php’;”行作用是 启用主动加载。这里顺带提一下还记得咱们议论 require\_once()和 include\_once()吗?咱们不须要手动搜寻要蕴含的文档,咱们只需应用 use 关键字将库导入咱们的代码即可。
部署 PHP 利用
最初作者写了一篇从零开始搭建 GIT 的文章比拟有意思,本局部内容倡议联合一些框架我的项目学习,博客提到的内容比拟入门这里就不记录了。
See how to setup Git and GitHub from zero
写在最初
更多的当作英文学习材料对待,顺带能学到一些技术内容,挺不错的。