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

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

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

《工欲善其事,必先利其器》
本文只是记录本小菜鸡在工作中遇到的知识点,欢迎大家随时补充!

一、初识 PHP

首先,PHP 它是什么?PHP 它又能做什么?

  • PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言;
  • PHP 脚本可以高效的在服务器上执行;
  • PHP 可免费下载使用;
  • PHP 文件可包含文本、HTMLJavaScript 代码和 PHP 代码;
  • PHP 代码在服务器上执行,结果以纯 HTML 形式返回给浏览器;
  • PHP 文件的默认文件扩展名是 “.php”;
  • PHP 可以使用渲染模板,生成动态页面内容;
  • PHP 可以创建、打开、读取、写入、关闭服务器上的文件;
  • PHP 可以收集表单数据;
  • PHP 可以发送和接收 cookies
  • PHP 可以添加、删除、修改您的数据库中的数据;
  • PHP 可以限制用户访问您的网站上的一些页面;
  • PHP 可以加密数据。

二、初识 MVC

不同于前端所识的 MVVMMVC 全名是 Model View Controller,是模型(model)- 视图(view)- 控制器(controller)的缩写,这是一种使用“模型-视图-控制器”设计创建Web应用程序的模式,同时提供了对HTMLCSSJavaScript的完全控制,它是一种软件设计典范。

  • Model (模型)是应用程序中用于处理应用程序数据逻辑的部分,通常体现在负责对数据库进行操作的部分;
  • View (视图)是应用程序中处理数据显示的部分,通常体现在页面渲染的数据中,视图是依据模型(model)的数据进行渲染的;
  • Controller (控制器)是应用程序中处理用户交互的部分,通常体现在负责从视图读取数据,控制用户输入,并向模型发送数据。

MVC模型

那么这种编程模式有什么优点?

  • MVC 使用一种业务逻辑、数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,达到减少编码的时间;
  • MVC 分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。例如,您可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易;
  • MVC 分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。

三、初识内存

PHP 的内存拥有四个分区。

1.栈区

程序可以操作的部分,在这里,PHP 不存储数据,只运行程序代码。所拥有的空间小但运行速度快,避免存在死循环,需要及时释放。

2.代码段区

这里不存在任何的操作,只储存你的 PHP 程序代码。所拥有的空间小,避免存在多个程序代码,需要及时释放。

3.数据段区

存储一些 PHP 普通数据类型的数据,这里分为全局区和静态区。拥有的空间大且效率高。

4.堆区

存储复杂的 PHP 数据类型,空间大但是效率低。

四、安装和使用

如果你要在服务端使用 PHP:

  1. 找一台支持 PHP 的主机,你就能愉快的写代码,服务器是自动解析这些 PHP 文件的;
  2. 如果服务器不支持 PHP ,那么需要安装 web 服务器(apache、nginx),再安装 PHP。

如果你要在本地电脑使用 PHP:

  1. 建议安装 phpstudy,它是一个环境集成软件,包含了 apache, mysql, nginx, ftp;
  2. 把你的 PHP 代码挂载到 phpstudy 网站域名对应的文件夹上,开启之后就可以通过浏览器本地浏览调试。

五、语法

分两种情况,第一种情况是在原生 PHP 文件里面书写:

PHP 脚本在服务器上执行,然后将纯 HTML 结果返回给浏览器,所以 PHP 脚本可以放在文档中的任何位置。

<?php
	// PHP代码
 ?>

原生的 PHP 文件通常包含了 HTML 标签和一些 PHP 脚本代码,例如我们输出一个 Hello World:

<!DOCTYPE html>
<html>
<body>
<h1>My first PHP page</h1>
<?php
echo "Hello World!";
?>  
</body>
</html>

第二种情况是在 PHP 框架的模板文件里面的书写语法:

由于 PHP 的框架一般都遵循上面提及的 MVC 设计典范(例如 thinkphp 框架),有些时候我们需要在 HTML 文件里面输出 PHP 代码,则需要用下面这种语法书写:

{php}
	// PHP代码
{/php}

例如给一个 HTML 标签输出的文本做判断,这时候我们可以这样写:

{foreach name="list" item="vo" key="k" }
  <tr >
      <td>
          {switch name="vo.gender" }
	          {case value="0"}未知{/case}
	          {case value="1"}男{/case}
	          {case value="2"}女{/case}
          {/switch}
      </td>
  </tr>
{/foreach}

六、变量

JavaScript 一样,PHP 是弱类型语言,这意味着某些变量输出时可能会跟首次定义的数据类型不一样,且不会报错:

<?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 关键字:

<?php
$a = 123;
function test() {
	global $a;
	echo $a;
}
test();
// 输出 123
?>

另外,PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中,index 保存变量的名称,这个数组可以用来更新全局变量:

<?php
$a = 123;
function test() {
	$GLOBALS['a'] = $GLOBALS['a'] + 1;
}
test();
echo $a;
// 输出 124
?>

为什么叫静态作用域?因为当一个函数完成时,它的所有变量都会被删除。如果你希望某个局部变量不要删除,就用 static 关键字进行声明局部变量,这个功能类似于 JavaScript 的闭包:

<?php
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 为常量名,一般为大写。
<?php
Class Person {
	const NAME = "张三";
	public function myName() {
		echo "我是".self::NAME;
	}
}
echo Person::NAME; // 输出张三
$p1 = new Person();
$p1 -> myName(); // 输出 我是张三
?>

十二、魔术常量

JavaScript 的 PI 常量一样,PHP 也既定了一些预定义常量。你可以理解为全局常量。

  • LINE

输出文件中,当前的行号:

<?php
echo '这是第' . __LINE__ . '行';
?>
  • FILE

输出当前文件所在位置的,完整文件名,如果在被包含文件中使用,则返回被包含的文件名:

<?php
echo '该文件位于'. __FILE__ . '文件中';
?>
  • DIR

输出当前文件所在的,目录,如果在被包含文件中使用,则返回被包含文件所在的,目录名称:

<?php
echo '该文件位于'. __DIR__ . '目录中';
?>
  • FUNCTION

输出函数被定义时的,名称:

<?php
function test() {
	echo '函数名为'. __FUNCTION__ ;
}
test();
?>
  • CLASS

输出该类被定义时的,名称:

<?php
class test {
    function _print() {
        echo '类名为:'  . __CLASS__ . "<br>";
        echo  '函数名为:' . __FUNCTION__ ; // 如果有这个,则输出该类声明的作用域下对应的,函数名称
    }
}
$t = new test(); // test
$t->_print(); // _print
?>
  • TRAIT

用于声明一个,可以被并入到其他父类的,子类:

<?php
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

输出一个类中的,方法名称:

<?php
function _print() {}
class test {
    function _print() {
        echo '类名为:'  . __CLASS__ . "<br>";
        echo  '函数名为' . __METHOD__ ;
    }
}
$t = new test();
$t->_print(); // 输出 test::_print
?>
  • NAMESPACE

输出当前命名空间的,名称:

<?php
namespace MyProject;
echo '命名空间为:"', __NAMESPACE__, '"'; // 输出 "MyProject"
?>

十三、超级全局变量

跟上面的常量不同,也与 JavaScript 的 Window 变量类似,PHP 既定了一些全局变量。

  • $GLOBALS

是一个包含了全部变量的全局组合数组。变量的名字就是数组的键。

<?php
$x = 75; 
$y = 25;
function addition() 
{ 
    $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y']; 
}
addition(); 
echo $z;  // 输出 100
?>
  • $_SERVER

是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。

<?php
echo $_SERVER['PHP_SELF']; // /try/demo_source/demo_global_server.php
echo "<br>";
echo $_SERVER['SERVER_NAME']; // www.csdn.net
echo "<br>";
echo $_SERVER['HTTP_HOST']; // www.csdn.net
echo "<br>";
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 "<br>";
echo $_SERVER['SCRIPT_NAME']; // /try/demo_source/demo_global_server.php
?>
  • $_REQUEST

用于收集HTML表单提交的数据。

<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php 
$name = $_REQUEST['fname']; 
echo $name; 
?>
</body>
</html>
  • $_POST

被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method=“post”。也可以用来收集 AJAX 的 post 数据。

<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php 
$name = $_POST['fname']; 
echo $name; 
?>
</body>
</html>
  • $_GET

同样被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method=“get”。$_GET 也可以收集URL中发送的数据。

<html>
<body>
<a href="test_get.php?subject=PHP&web=csdn.net">Test $GET</a>
</body>
</html>
<?php 
echo "Study " . $_GET['subject'] . " @ " . $_GET['web'];
?>
  • $_FILES
    待更新…

  • $_ENV
    待更新…

  • $_COOKIE

cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。

<?php
setcookie("user", "csdn", time()+3600);
?>
<html>
.....

需要注意的是,setcookie 函数必须要置于 HTML 标签之前。

取回 cookie 和删除 cookie:

<?php
// 输出 cookie 值
echo $_COOKIE["user"];
// 查看所有 cookie
print_r($_COOKIE);
?>
// 设置 cookie 过期时间为过去 1 小时,即可删除
setcookie("user", "", time()-3600);
  • $_SESSION

PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。它常常被用来做计数器。

<?php
session_start();
if(isset($_SESSION['views']))
{
    $_SESSION['views']=$_SESSION['views']+1;
}
else
{
    $_SESSION['views']=1;
}
echo "浏览量:". $_SESSION['views'];
?>

关于销毁 session 的方法:

<?php
session_start();
if(isset($_SESSION['views']))
{
    unset($_SESSION['views']); // unset() 函数用于释放指定的 session 变量
}
session_destroy(); // 该函数彻底销毁 session
?>

十四、数组

声明方式:

<?php
$car = array("Volvo", "Audi", "Benz");
$cars = ["Volvo", "Bmw", "Posche", "Ferarri"];
?>

获取数组长度,跟 JavaScript 不一样,不是数组的内置属性,需要手动获取:

<?php
$carLength = count($car);
echo $carLength; // 输出 3
?>

遍历数组,在确定数组不为空的情况下,可以使用foreach,否则使用for:

<?php
for($x=0;$x<$countLength;$x++) {
	echo $car[$x];
}
foreach($cars as $k => $v) {
	echo $cars[$k];
	// $k 是下标,$v 是每一项
}
?>

关联数组,就是为数组的每一个值指定键名:

<?php
$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 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。语法格式如下;

<?php
// 定义代码在 'MyProject' 命名空间中  
namespace MyProject;  
// ... 代码 ... 

如果有多个命名空间存在同一文件下,当然这是极不建议的行为,就使用大括号分隔开:

<?php
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 很相似的,大家需要多多思考,举一反三。
感谢你的阅读。

                       

点击阅读全文

上一篇 2023年 6月 11日 am10:32
下一篇 2023年 6月 11日 am10:33