▷ PHP —— 一份前端开发工程师够用的PHP知识点(持续更新)

PHP —— 一份前端开发工程师够用的PHP知识点(持续更新)
《工欲善其事,必先利其器》 本文只是记录本小菜鸡在工作中遇到的知识点,欢迎大家随时补充!
一、初识 PHP
首先,PHP 它是什么?PHP 它又能做什么?
PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言;PHP 脚本可以高效的在服务器上执行;PHP 可免费下载使用;PHP 文件可包含文本、HTML、JavaScript 代码和 PHP 代码;PHP 代码在服务器上执行,结果以纯 HTML 形式返回给浏览器;PHP 文件的默认文件扩展名是 “.php”;PHP 可以使用渲染模板,生成动态页面内容;PHP 可以创建、打开、读取、写入、关闭服务器上的文件;PHP 可以收集表单数据;PHP 可以发送和接收 cookies;PHP 可以添加、删除、修改您的数据库中的数据;PHP 可以限制用户访问您的网站上的一些页面;PHP 可以加密数据。
二、初识 MVC
不同于前端所识的 MVVM,MVC 全名是 Model View Controller,是模型(model)- 视图(view)- 控制器(controller)的缩写,这是一种使用“模型-视图-控制器”设计创建Web应用程序的模式,同时提供了对HTML、CSS和JavaScript的完全控制,它是一种软件设计典范。
Model (模型)是应用程序中用于处理应用程序数据逻辑的部分,通常体现在负责对数据库进行操作的部分;View (视图)是应用程序中处理数据显示的部分,通常体现在页面渲染的数据中,视图是依据模型(model)的数据进行渲染的;Controller (控制器)是应用程序中处理用户交互的部分,通常体现在负责从视图读取数据,控制用户输入,并向模型发送数据。
那么这种编程模式有什么优点?
MVC 使用一种业务逻辑、数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,达到减少编码的时间;MVC 分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。例如,您可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易;MVC 分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。
三、初识内存
PHP 的内存拥有四个分区。
1.栈区
程序可以操作的部分,在这里,PHP 不存储数据,只运行程序代码。所拥有的空间小但运行速度快,避免存在死循环,需要及时释放。
2.代码段区
这里不存在任何的操作,只储存你的 PHP 程序代码。所拥有的空间小,避免存在多个程序代码,需要及时释放。
3.数据段区
存储一些 PHP 普通数据类型的数据,这里分为全局区和静态区。拥有的空间大且效率高。
4.堆区
存储复杂的 PHP 数据类型,空间大但是效率低。
四、安装和使用
如果你要在服务端使用 PHP:
找一台支持 PHP 的主机,你就能愉快的写代码,服务器是自动解析这些 PHP 文件的;如果服务器不支持 PHP ,那么需要安装 web 服务器(apache、nginx),再安装 PHP。
如果你要在本地电脑使用 PHP:
建议安装 phpstudy,它是一个环境集成软件,包含了 apache, mysql, nginx, ftp;把你的 PHP 代码挂载到 phpstudy 网站域名对应的文件夹上,开启之后就可以通过浏览器本地浏览调试。
五、语法
分两种情况,第一种情况是在原生 PHP 文件里面书写:
PHP 脚本在服务器上执行,然后将纯 HTML 结果返回给浏览器,所以 PHP 脚本可以放在文档中的任何位置。
// PHP代码
?>
原生的 PHP 文件通常包含了 HTML 标签和一些 PHP 脚本代码,例如我们输出一个 Hello World:
My first PHP page
echo "Hello World!";
?>
第二种情况是在 PHP 框架的模板文件里面的书写语法:
由于 PHP 的框架一般都遵循上面提及的 MVC 设计典范(例如 thinkphp 框架),有些时候我们需要在 HTML 文件里面输出 PHP 代码,则需要用下面这种语法书写:
{php}
// PHP代码
{/php}
例如给一个 HTML 标签输出的文本做判断,这时候我们可以这样写:
{foreach name="list" item="vo" key="k" }
{switch name="vo.gender" }
{case value="0"}未知{/case}
{case value="1"}男{/case}
{case value="2"}女{/case}
{/switch}
{/foreach}
六、变量
跟 JavaScript 一样,PHP 是弱类型语言,这意味着某些变量输出时可能会跟首次定义的数据类型不一样,且不会报错:
$a = 8;
$b = "123";
$a = $b;
echo $a; // 输出 “123”
?>
跟 JavaScript 一样,PHP 的变量,可以事先声明但不赋值,也可以即时声明,即刻使用。上述例子中,PHP 的变量都需要从一个 $ 符号开始,后面跟着变量的名称,其命名规则与 JavaScript 基本一致。
变量以 $ 符号开始,后面跟着变量的名称;变量名必须以字母或者下划线字符开始;变量名只能包含字母、数字以及下划线(A-z、0-9 和 _ );变量名不能包含空格;变量名是区分大小写的($y 和 $Y 是两个不同的变量)。
七、数据类型
第一种,简单数据类型:
整型(int / integer):系统分配4个字节存储,表示整数类型;浮点型(float / double):系统分配8个字节存储,表示小数或者整型存储不下的整数;字符串类型(string):系统根据实际长度分配,表示字符串;布尔类型(bool / boolean):只有两个值。
第二种,复合数据类型:
对象类型(object):存放对象;数组类型(array):存放多个数据,可以是其他类型。
第三种,特殊数据类型:
资源类型(resource):存放资源数据,例如数据库,文件等数据;空类型(NULL):只有一个值 NULL,且不可被运算。
八、作用域
PHP 有四种不同的变量作用域,分别是:
local(局部作用域)global(全局作用域)static(静态作用域)parameter(参数作用域)
局部作用域和全局作用域互不相干扰,不可互相访问。如果要在局部作用域中访问一个全局变量,则需要 global 关键字:
$a = 123;
function test() {
global $a;
echo $a;
}
test();
// 输出 123
?>
另外,PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中,index 保存变量的名称,这个数组可以用来更新全局变量:
$a = 123;
function test() {
$GLOBALS['a'] = $GLOBALS['a'] + 1;
}
test();
echo $a;
// 输出 124
?>
为什么叫静态作用域?因为当一个函数完成时,它的所有变量都会被删除。如果你希望某个局部变量不要删除,就用 static 关键字进行声明局部变量,这个功能类似于 JavaScript 的闭包:
function test() {
static $a = 0;
echo $a;
$a++;
}
test();
test();
test();
// 依次输出:0,1,2 而不是每次都输出 0
?>
需要注意的是,它依然是一个局部变量,外部访问不到。
九、输出
echo(),输出一个或多个字符串;print(),只允许输出一个字符串,返回值总为1;var_dump($a),输出一个变量的数据类型和值;settype($a, 'int'),改变一个变量的数据类型。
十、类型比较
与 JavaScript 一致,弱类型比较包含松散比较和严格比较:
松散比较:使用两个等号比较,只比较值,不比较类型;严格比较:使用三个等号比较,除了比较值,还比较数据类型。
十一、常量
全局常量(define(name, value, case_insensitvie)):一般大写,第三个值可选是否对常量的大小写敏感,默认为false敏感;Class常量(const constant = value):constant 为常量名,一般为大写。
Class Person {
const NAME = "张三";
public function myName() {
echo "我是".self::NAME;
}
}
echo Person::NAME; // 输出张三
$p1 = new Person();
$p1 -> myName(); // 输出 我是张三
?>
十二、魔术常量
像 JavaScript 的 PI 常量一样,PHP 也既定了一些预定义常量。你可以理解为全局常量。
LINE
输出文件中,当前的行号:
echo '这是第' . __LINE__ . '行';
?>
FILE
输出当前文件所在位置的,完整文件名,如果在被包含文件中使用,则返回被包含的文件名:
echo '该文件位于'. __FILE__ . '文件中';
?>
DIR
输出当前文件所在的,目录,如果在被包含文件中使用,则返回被包含文件所在的,目录名称:
echo '该文件位于'. __DIR__ . '目录中';
?>
FUNCTION
输出函数被定义时的,名称:
function test() {
echo '函数名为'. __FUNCTION__ ;
}
test();
?>
CLASS
输出该类被定义时的,名称:
class test {
function _print() {
echo '类名为:' . __CLASS__ . "
";
echo '函数名为:' . __FUNCTION__ ; // 如果有这个,则输出该类声明的作用域下对应的,函数名称
}
}
$t = new test(); // test
$t->_print(); // _print
?>
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(); // 输出 Hello World
?>
注意:从基类继承的成员被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。
METHOD
输出一个类中的,方法名称:
function _print() {}
class test {
function _print() {
echo '类名为:' . __CLASS__ . "
";
echo '函数名为' . __METHOD__ ;
}
}
$t = new test();
$t->_print(); // 输出 test::_print
?>
NAMESPACE
输出当前命名空间的,名称:
namespace MyProject;
echo '命名空间为:"', __NAMESPACE__, '"'; // 输出 "MyProject"
?>
十三、超级全局变量
跟上面的常量不同,也与 JavaScript 的 Window 变量类似,PHP 既定了一些全局变量。
$GLOBALS
是一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
$x = 75;
$y = 25;
function addition()
{
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}
addition();
echo $z; // 输出 100
?>
$_SERVER
是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。
echo $_SERVER['PHP_SELF']; // /try/demo_source/demo_global_server.php
echo "
";
echo $_SERVER['SERVER_NAME']; // www.csdn.net
echo "
";
echo $_SERVER['HTTP_HOST']; // www.csdn.net
echo "
";
echo $_SERVER['HTTP_USER_AGENT']; // Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36
echo "
";
echo $_SERVER['SCRIPT_NAME']; // /try/demo_source/demo_global_server.php
?>
$_REQUEST
用于收集HTML表单提交的数据。
$name = $_REQUEST['fname'];
echo $name;
?>
$_POST
被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method=“post”。也可以用来收集 AJAX 的 post 数据。
$name = $_POST['fname'];
echo $name;
?>
$_GET
同样被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method=“get”。$_GET 也可以收集URL中发送的数据。
echo "Study " . $_GET['subject'] . " @ " . $_GET['web'];
?>
$_FILES 待更新…
$_ENV 待更新…
$_COOKIE
cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。
setcookie("user", "csdn", time()+3600);
?>
.....
需要注意的是,setcookie 函数必须要置于 HTML 标签之前。
取回 cookie 和删除 cookie:
// 输出 cookie 值
echo $_COOKIE["user"];
// 查看所有 cookie
print_r($_COOKIE);
?>
// 设置 cookie 过期时间为过去 1 小时,即可删除
setcookie("user", "", time()-3600);
$_SESSION
PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。它常常被用来做计数器。
session_start();
if(isset($_SESSION['views']))
{
$_SESSION['views']=$_SESSION['views']+1;
}
else
{
$_SESSION['views']=1;
}
echo "浏览量:". $_SESSION['views'];
?>
关于销毁 session 的方法:
session_start();
if(isset($_SESSION['views']))
{
unset($_SESSION['views']); // unset() 函数用于释放指定的 session 变量
}
session_destroy(); // 该函数彻底销毁 session
?>
十四、数组
声明方式:
$car = array("Volvo", "Audi", "Benz");
$cars = ["Volvo", "Bmw", "Posche", "Ferarri"];
?>
获取数组长度,跟 JavaScript 不一样,不是数组的内置属性,需要手动获取:
$carLength = count($car);
echo $carLength; // 输出 3
?>
遍历数组,在确定数组不为空的情况下,可以使用foreach,否则使用for:
for($x=0;$x<$countLength;$x++) {
echo $car[$x];
}
foreach($cars as $k => $v) {
echo $cars[$k];
// $k 是下标,$v 是每一项
}
?>
关联数组,就是为数组的每一个值指定键名:
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
echo "Peter is " . $age['Peter'] . " years old.";
?>
数组的排序,有多种排序方法:
sort() - 对数组进行升序排列rsort() - 对数组进行降序排列asort() - 根据关联数组的值,对数组进行升序排列ksort() - 根据关联数组的键,对数组进行升序排列arsort() - 根据关联数组的值,对数组进行降序排列krsort() - 根据关联数组的键,对数组进行降序排列
十五、JSON
json_encode,将 PHP 变量转为 JSON 格式;json_decode,对 JSON 格式的数据进行解码,转为 PHP 变量;json_last_error,返回最后发生的错误。
十六、命名空间
命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。语法格式如下;
// 定义代码在 'MyProject' 命名空间中
namespace MyProject;
// ... 代码 ...
如果有多个命名空间存在同一文件下,当然这是极不建议的行为,就使用大括号分隔开:
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace AnotherProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
?>
命名空间一般用来解决以下两类问题:
用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
十七、面向对象(Class)
太多了,不想写,看 文档 吧。平时如果用框架经常会用得到,很少有人写原生 PHP 了,所以最好还是看一下。
十八、表单
我们要非常清楚的认识到,一旦前端页面提交数据,与后端代码进行交互,这是唯一与后端代码进行互动的点。所以在安全性上我们要多加防范。
在获取 GET 请求数据时,由于 GET 是明文传输,所以要通过一些手段进行优化:
由于 PHP 代码的 $_SERVER[‘PHP_SELF’] 这个字段,非常容易被黑客利用,所以,在获取 GET 请求数据的时候,我们可以通过 htmlspecialcharts() ,对代码进行保护:
?php
$q = isset($_GET['q'])? htmlspecialchars($_GET['q']) : '';
if($q) {
......
}
?>
利用 trim() 函数去除用户输入数据中不必要的字符,例如空格或者tap换行符等;利用 stripslasher() 函数去除数据中的反斜杠;使用 empty() 函数检查数据是否为空;使用 preg_match() 进行一些正则表达式。
十九、总结
至此,原生 PHP,个人认为的,前端需要了解的知识,就这么多了。至于遇见一些没看过的 API ,就通过百度去查询吧。 很多东西还是跟 JavaScript 很相似的,大家需要多多思考,举一反三。 感谢你的阅读。