英文博客专栏PHP疾速入门

引言

本文是对于英文原始博客的一个PHP入门专栏的集体笔记摘录,因为十分入门并且本身有JAVA语言根底,看的比拟快并且会疏忽很多共同点,倡议读者有能力能够看看博客的原文顺带晋升英文能力,作者文字表达能力十分强,写的十分棒。

这篇专栏介绍了PHP8入门,专栏写于2022年中旬,不论是单词还是语法句式都非常通俗易懂,学技术的同时晋升英语水平并且有助于晋升自信心

目录

  • 介绍
  • 过往历史
  • php是一个怎么样的语言
  • 设置PHP
  • 第一个PHP程序
  • 根本类型
  • 操作符

    • 字符串操作
  • 编写正文
  • 和数字无关的内置函数
  • Array数组

    • arrays罕用函数
  • 关联数组
  • 条件语句
  • 循环
  • 函数

    • 匿名函数
    • 值传递和地址传递
    • 箭头函数
    • 应用map,reduce,filter函数循环数组解决
  • 面向对象

    • 面向对象探讨
    • 如何构建对象
    • 属性和办法
    • 继承
    • 重写
    • 动态
    • 对象比拟
    • 对象遍历
    • 对象克隆
    • 魔术办法
  • 文件蕴含
  • 文档零碎的有用常量、函数和变量
  • 谬误
  • 异样
  • 日期
  • 常量和枚举
  • PHP web平台部署

    • 解决HTTP申请
    • $\_SEVER 对象
    • 应用cookies
    • Sessions
    • IO
    • database
    • JSON
    • email
  • 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,MysqlRedis等等。

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文件全文替换成上面的代码。

<?phpecho '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 strings
  • array arrays
  • object objects
  • null 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 restsubstr($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 array
  • array_unique() to remove duplicate values from an array
  • array_search() to search a value in the array and returns the key
  • array_reverse() to reverse an array
  • array_reduce() to reduce an array to a single value using a callback function
  • array_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 function
  • max() to get the maximum value contained in the array
  • min() to get the minimum value contained in the array
  • array_rand() to get a random item from the array
  • array_count_values() to count all the values in the array
  • implode() to turn an array into a string
  • array_pop() to remove the last item of the array and return its value
  • array_shift() same as array_pop() but removes the first item instead of the last
  • sort() to sort an array
  • rsort() to sort an array in reversing order
  • array_walk() similarly to array_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 array
  • array_keys() to get all the keys from the array
  • array_values() to get all the values from the array
  • asort() to sort an associative array by value
  • arsort() to sort an associative array in descending order by value
  • ksort() to sort an associative array by key
  • krsort() 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 = 17switch($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 foreachwhiledo 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!'// resultTypeError: Dog::__construct():Argument #1 ($name) must be of type int,string given on line 14

对象属性在PHP中存在三个限定符号,能够手动指定上面三个级别:

protectedprivatepublic

这几个类别别离对应了继承对象可见,公有,对外公开,和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的没什么区别。

办法外部的&dollar;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; //trueecho $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_oncerequire_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` filerequire_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()办法和查看:

<?phpphpinfo();?>

原作者案例的对应的门路为:/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');

这种常量定义在应用的时候不须要应用&dollar;符号:

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 种形式应用。

  1. 第一种办法是相似JSP一样在HTML中嵌入PHP后端语言代码达到动态数据展现的成果。
  2. 第二种是PHP更像是负责生成“利用过程”的引擎,模板语言来生成HTML,并且所有内容都由咱们所谓的框架治理。(举荐)

解决HTTP申请

本局部介绍了在没有任何框架的状况下如何接管和解决HTTP申请,咱们能够在webroot的门路创立一个test.php文件,此时如果对于脚手架配置伪动态,能够间接通过/test拜访。

WEB利用绝大部分都是POST和GET申请,PHP提供了$_GET, $_POST and $_REQUEST 这些办法

$ _GET:对于任何申请,您能够应用 $\_ GET 对象拜访所有查问字符串数据,该对象称为超全局,并在咱们所有的 PHP 文档中主动可用。
&dollar;\_ 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&dollar;\_SEVER 对象

$_SERVER 蕴含了许多十分有用的服务器信息,咱们能够应用Phpinfo办法获取服务器内容:

<?phpphpinfo();?>

上面是根本用法:

  • $_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']

&dollar;\_GET办法的应用案例如下:

<form>  <input type="text" name="name" />  <input type="submit" /></form><?phpif (isset($_GET['name'])) {  echo '<p>The name is ' . $_GET['name'];}?>

&dollar;\_POST办法的应用案例如下:

<form **method="POST"**>  <input type="text" name="name" />  <input type="submit" /></form><?phpif (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应用的一些简略例子:

<?phpif (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 的会话。

<?phpsession_start();?>

你会发现拜访对应文件之后,你将会看到一个新cookie名称(PHPSESSID)被定义。这个ID就是咱们常说的session ID

与咱们应用 cookie 的形式相似,咱们当初能够应用 $_SESSION 来存储用户发送的信息,但这次它不存储在客户端。只有PHPSESSID会被存储到客户端。

<?phpsession_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'));//orwhile (!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 JSON
  • json_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)

email

发送邮件能够应用上面的办法:

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文件当中能够应用上面的用法:

<?phprequire '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

写在最初

更多的当作英文学习材料对待,顺带能学到一些技术内容,挺不错的。