当前位置: 首页 > 工具软件 > PHP > 使用案例 >

PHP 基本知识点介绍

蓬威
2023-12-01


前言

PHP 基本知识点介绍。


一、PHP是什么语言

PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源的、简单的,面向对象的,解释型的,健壮的,安全的,性能非常之高的,独立于架构的,可移植的,动态的脚本语言。

用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。

PHP不仅可用来开发Web应用程序,也可以开发普通应用程序。

采用PHP的网站如新浪网(sina)、中国人(Chinaren)等,但由于PHP本身存在的一些缺点,使得它不适合应用于大型电子商务站点,而更适合一些小型的商业站点。首先,PHP缺乏规模支持。其次,缺乏多层结构支持。对于大负荷站点,解决方法只有一个:分布计算。数据库、应用逻辑层、表示逻辑层彼此分开,而且同层也可以根据流量分开,群组成二维数组。而PHP则缺乏这种支持。还有上面提到过的一点,PHP提供的数据库接口支持不统一,这就使得它不适合运用在电子商务中。


二、基础知识

1. 运行环境

Windows 环境:
WAMP = windows + apache + mysql + php
WNMP = windows + nginx+ mysql + php

Linux环境:
LAMP = linux + apache + mysql + php
LNMP = linux + nginx+ mysql + php

常用集成环境软件:wampserver、phpstudy、Xampp等。

2、基本语法

纯php写法:

<?php
// PHP 代码
echo "Hello World!";
?>

html和PHP嵌套写法:

<!DOCTYPE html>
<html>
<body>

<?php
echo "Hello World!";
?>

</body>
</html>
1. PHP 脚本以 <?php 开始,以 ?> 结束;
2. 每条语句后边都要加分号;
3. PHP 文件的默认文件扩展名是 ".php"。
4. PHP 文件通常包含 HTML 标签和一些 PHP 脚本代码;
   如果是纯php代码,可以不写结束标签 ?> ,也不推荐写结束标签 ?>;
   后者除了php代码,还有html代码,必须要写结束标签 ?>。
5. php代码的执行顺序: 从上往下,依次执行
6. 单行注释: //这里是注释内容
   多行注释: /*这里是注释内容*/
7. 单引号和双引号对比:
	- 双引号可以解释变量,单引号不可以解释变量。
    - 双引号可以使用 \ 解释转义字符;单引号不解释转义字符,必须加上 \ 才可以解释,除了\\;
   	  转义字符: \r(回车)  \n(换行)   \t(制表) \\(表示一个反斜线) 等。
    - 双引号中可以加单引号,单引号可以加双引号;双引号中不能加双引号,单引号中不能加单引号,如果要加,需要转义。
    - 尽量使用单引号就是用单引号,因为它的效率更高,双引号需要解释,在输出。
8. 变量命名
	- 变量必须以$开始,由数字,字母,下划线的组合,但是不能以数字开始。
	- 变量名要起的有意义,达到见名知意(建议优先考虑英文)
	- 变量名遵循驼峰法或者下划线法(建议大家使用小驼峰)
	- 变量名区分大小写
9. 常量定义:define('常量名',常量值); 
10. 数据类型
	- 整型   浮点型   字符串类型   布尔型   数组   对象   资源   空(null)
11. 输出方式
	- echo   - 可以输出一个或多个字符串
	- print   - 只能输出简单类型变量的值,如int,string
	- print_r - 可以输出复杂类型变量的值,如数组,对象
	- printf -函数用于格式化输出字符串,主要用于字符串中以%开头的格式字符串替换。
	- sprintf -函数也用做字符串格式化。该函数与 printf 函数基本相同, 但它可以将转换后的结果保存到一个字符串变量中,而不是直接输出。(因为跟printf类似,下面就不做详细演示了)
	- var_dump -打印变量的相关信息,包括表达式的类型与值,通过缩进显示其结构。
	
	提示:echo输出的速度比print快,echo是PHP语句,没有返回值,print和print_r是PHP函数,函数有返回值。
	print返回值为1(int类型),print_r返回值为true(bool类型)。

3、超全局变量

1、$GLOBALS

$GLOBALS 是一个预定义的超全局数组,其中包含了全局作用域中的所有可用变量,变量的名字就是数组的键。在一个PHP脚本的全部作用域中都可以访问。还有一个与$GLOBALS 很类似的叫 global 关键字,它也可以让我们在函数内部使用在函数外部定义的全局变量。

<?php

function test() {
    $foo = "局部变量";
    echo 'GLOBALS 中 foo 是: ' . $GLOBALS["foo"] . "\n";
    echo 'test 中 foo 是: ' . $foo . "\n";
    
	global $foo2; // 通过global来声明$foo2,相当于传递参数
	$foo2 += 1;
}
$foo = "全局变量";
$foo2 = 1;
test();
echo 'foo2 = ' . $foo2 . "\n";
//输出:
//GLOBALS 中 foo 是: 全局变量
//test 中 foo 是: 局部变量
//foo2 = 2
?>

2、$_SERVER

$_SERVER 准确来说是一个数组,包含了头信息、路径、以及脚本位置等等信息。这个数组中的项目由 Web 服务器创建。服务器可能会忽略一些,不一定每个服务器都提供全部项目。
下表列出了 $_SERVER 变量中的部分元素(以本篇博客地址为例):

参数描述
DOCUMENT_ROOT当前运行脚本所在的文档根目录。在服务器配置文件中定义。 /weixin_43844718/article/details/126857460
HTTP_ACCEPT当前请求头中 Accept: 项的内容,如果存在的话。
HTTP_ACCEPT_CHARSET当前请求头中 Accept-Charset: 项的内容,如果存在的话。例如:“iso-8859-1,*,utf-8”。
HTTP_ACCEPT_LANGUAGE当前请求头中 Accept-Language: 项的内容(如果存在)。例如,“en”
HTTP_HOST当前请求头中 Host: 项的内容,如果存在的话。
HTTP_REFERER引导用户代理到当前页的前一页的地址(如果存在)。由 user agent 设置决定。并不是所有的用户代理都会设置该项,有的还提供了修改 HTTP_REFERER 的功能。简言之,该值并不可信。)
HTTPS如果脚本是通过 HTTPS 协议被访问,则被设为一个非空的值。
PHP_SELF当前执行脚本的文件名,与 document root 有关。例如,在地址为 /weixin_43844718/article/details/126857460
PATH_INFO包含由客户端提供的、跟在真实脚本名称之后并且在查询语句(query string)之前的路径信息(如果存在)
PATH_TRANSLATED当前脚本所在文件系统(非文档根目录)的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。
SCRIPT_FILENAME当前执行脚本的绝对路径。
SERVER_ADMIN该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。
SERVER_PORTWeb 服务器使用的端口。默认值为 “80”。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。
SERVER_SIGNATURE包含了服务器版本和虚拟主机名的字符串。
SCRIPT_NAME包含当前脚本的路径。
SCRIPT_URIURI 用来指定要访问的页面。例如 “/index.html”。
SERVER_ADDR当前运行脚本所在的服务器的 IP 地址。
SERVER_NAME当前运行脚本所在的服务器的主机名。例如,“blog.csdn.net”。
SERVER_SOFTWARE服务器标识字符串,在响应请求时的头信息中给出。 (如:Apache/2.2.24)
SERVER_PROTOCOL请求页面时通信协议的名称和版本。例如,“HTTP/1.0”。
REMOVE_ADDR浏览当前页面的用户 IP 地址,注意与 $_SERVER[‘SERVER_ADDR’] 的区别。
REQUEST_METHOD访问页面使用的请求方法;例如,“GET”, “HEAD”,“POST”,“PUT”。
REQUEST_URIURI 用来指定要访问的页面。例如,“index.html”
REQUEST_TIME请求开始时的时间戳。从 PHP 5.1.0 起可用。 (如:1377687496)
REMOTE_ADDR浏览当前页面的用户的 IP 地址。
REMOTE_HOST浏览当前页面的用户的主机名。DNS 反向解析不依赖于用户的 REMOTE_ADDR。
REMOTE_PORT用户机器上连接到 Web 服务器所使用的端口号。

3、$_GET

$_GET 可以获取到使用 get 方法传递的参数的相关信息。

4、$_POST

$_POST 可以获取到使用 post 方法传递的参数的相关信息。

5、$_REQUEST

$_REQUEST 是一个关联数组,默认包含 $_GET、$_POST、$_COOKIE 中的内容。建议不用这个超级变量,因为它不够安全。

6、$_FILES

$_FILES 是一个关联数组,包含通过 HTTP POST 方法上传给当前脚本的文件内容。

$_FILES数组内容如下: 
$_FILES['file']['name'] 客户端文件的原名称。 
$_FILES['file']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"。 
$_FILES['file']['size'] 已上传文件的大小,单位为字节。 
$_FILES['file']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函数设置是不起作用的。 
$_FILES['myFile']['error'] 和该文件上传相关的错误代码。['error'] 是在 PHP 4.2.0 版本中增加的。下面是它的说明:(它们在PHP3.0以后成了常量) 
	UPLOAD_ERR_OK :0; 没有错误发生,文件上传成功。 
	UPLOAD_ERR_INI_SIZE :1; 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。 
	UPLOAD_ERR_FORM_SIZE :2; 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。 
	UPLOAD_ERR_PARTIAL :3; 文件只有部分被上传。 
	UPLOAD_ERR_NO_FILE :4或5; 4-没有文件被上传;5-上传文件大小为0.

7、$_COOKIE

$_COOKIE 是一个关联数组,包含 通过 HTTP cookie 传递给当前脚本的内容。

8、$_SESSION

$_SESSION 是一个关联数组,包含当前脚本中的所有 session 内容。

9、$_ENV

$_ENV 是一个包含服务器端环境变量的数组。

4、魔术常量

PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。有八个魔术常量它们的值随着它们在代码中的位置改变而改变。

魔术常量描述
__LINE__文件中的当前行号。
__FILE__文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
__DIR__文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
__DIR__文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
__METHOD__当前函数的名称。
__CLASS__当前类的名称。
__NAMESPACE__当前命名空间的名称。
__TRAIT__Trait 的名字。

5、魔术方法

php规定以两个下划线 __ 开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开头,除非是为了重载已有的魔术方法,所有魔术方法都必须被定义为公共的。

魔术方法描述
__get当调用一个未定义的属性时访问此方法。
__set给一个未定义的属性赋值时调用。
__isset当在一个未定义的属性上调用isset()函数时调用此方法。
__unset当在一个未定义的属性上调用unset()函数时调用此方法。
__call当调用一个未定义(包括没有权限访问)的方法是调用此方法。
__autoload使用尚未被定义的类时自动调用。通过此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。
注意: 在
__construct构造方法,当一个对象被创建时调用此方法。
__destruct析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法。
默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源.,析构函数允许你在使用一个对象之后执行任意代码来清除内存,当PHP决定你的脚本不再与对象相关时,析构函数将被调用。
在一个函数的命名空间内,这会发生在函数return的时候,对于全局变量,这发生于脚本结束的时候,如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值,通常将变量赋值勤为NULL或者调用unset。
__clone使用clone方法复制一个对象时,对象会自动调用__clone魔术方法,如果在对象复制需要执行某些初始化操作,可以在__clone方法实现。
__toString在将一个对象转化成字符串时自动调用,比如使用echo打印对象时,如果类没有实现此方法,则无法通过echo打印对象,否则会显示:Catchable fatal error: Object of class test could not be converted to string in,此方法必须返回一个字符串。
__sleep串行化的时候用。
serialize() 检查类中是否有魔术名称 __sleep 的函数。如果这样,该函数将在任何序列化之前运行。它可以清除对象并应该返回一个包含有该对象中应被序列化的所有变量名的数组。
使用 __sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。
__wakeup反串行化的时候调用。相反地,unserialize() 检查具有魔术名称 __wakeup 的函数的存在。如果存在,此函数可以重建对象可能具有的任何资源。使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。
__set_state调用var_export()导出类时,此静态方法会被调用。
__invoke当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。
__callStatic__callStatic() 是为了处理静态方法调用,PHP5.3.0以上版本有效,PHP 确实加强了对 __callStatic() 方法的定义;它必须是公共的,并且必须被声明为静态的。

6、类和对象

1、类和对象

类的实体化结果是对象,而对象的抽象就是类。在开发过程中,我们通常都是先抽象(幻想)出一个类,再用该类去创建对象(实现幻想的内容)。在程序中,直接使用的是我们(实现幻想)的对象,而不是抽象(幻想)的类。

2、面向对象和面向过程

什么是面向过程:面向过程就好比一个人 自己洗衣服、做饭,什么事情都是自己解决
什么是面向对象:面向对象就是那个人有了对象,让对象去洗衣服、做饭。

3、类的三大特性

三大基本特性:封装、继承、多态:

封装: 指将客观事物抽象成类,每个类对自身的数据和方法实行保护。类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐蔽

继承: 指可以让某个类型的对象获得另一个类型的对象的属性的方法。可以使用现有类的所有功能,而不需要重新编写原来的类,目的是为了进行代码复用和支持多态。它一般有三种形式:实现继承、可视继承、接口继承 实现继承:指使用基类的属性和方法而无需额外编码的能力;可视继承:指子窗体使用父窗体的外观和实现代码;接口继承:接口继承仅使用属性和方法,实现之后到子类实现;

多态: 指同一个实体同时具有多种形式,它主要体现在类的继承体系中,它是将父对象设置成和一个或更多的它的子对象相等的技术,赋值以后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。

7、命名空间

1、定义命名空间

namespace 关键字定义命名空间。

namespace 命名空间名;

2、定义子命名空间

PHP中的命名空间与目录和文件的关系是很像的,可以允许指定层次化的命名空间名称。因此,命名空间的名字可以使用分层次的方式来定义,它的语法格式如下:

namespace App\Model;
namespace App\Controller\Home;

3、使用命名空间

在了解应该如何使用命名空间之前,我们应该要了解的是在PHP中是怎么知道要是用哪一个命名空间中的元素的,这时候我们就需要知道PHP中命名空间元素访问的原理了。首先PHP中的我们不太清楚,但是文件系统我们可以总结出访问文件的三种方式:

相对文件名、相对路径名和绝对路径名。

PHP命名空间的元素只用同样的原理,例如命名空间下的类名可以通过三种方式引出:

非限定名称,或不包含前缀的类名称,例如 $a = new test() 或者 test,如果当前命名空间是 currentnamespace,那么 test 将被解析为 currentnamespace\test 。如果 test 的代码是全局的,不包含任何命名空间中的代码,那么 test 会被解析为 test

限定名称,或包含前缀名称,例如 $a = new subnamespace\test(),如果当前命名空间是currentnamespace,则 test 会被解析为 currentnamespace\subnamespace\test,如果 test 的代码是全局的,不包含任何命名空间中的代码,那么 test 会被解析为subnamespace\foo

完全限定名称,或包含了全局前缀操作符的名称,例如 $a = new \currentnamespace\test() ,这种情况下,test 总是被解析为代码中的文字名 currentnamespace\test

4、导入、别名

在PHP中,通过use关键字和as配合可以实现命名空间的导入和设置别名。它的语法格式如下:

use 命名空间 as 别名;

三、PHP 六大设计原则

设计模式六大原则:1、单一原则;2、里氏替换原则;3、依赖倒置原则;4、接口隔离原则;5、迪米特原则;6、开闭原则。

1、单一原则(Single Responsibility Principle)

一个类或者一个方法只负责一项职责,尽量做到类的只有一个行为原因引起变化(高内聚,低耦合);

2、里氏替换原则(LSP liskov substitution principle)

子类可以扩展父类的功能,但不能改变原有父类的功能;

3、依赖倒置原则(dependence inversion principle)

依赖抽象,而不是依赖具体,就是面向接口变成 面向接口编程  具体实现可以随便换,
只需要对接口编程即可,就算具体的实现被替换了,原来的代码不用变。
通俗点就是说变量或者传参数,尽量使用抽象类,或者接口;

4、接口隔离原则(interface segregation principle)

建立单一接口;(扩展为类也是一种接口,一切皆接口)
	a.客户端不应该依赖它不需要的接口
	b.类之间依赖关系应该建立在最小的接口上;
只需要暴露最小接口(暴露需要的接口) 
简单理解:复杂的接口,根据业务拆分成多个简单接口;接口的设计粒度越小,系统越灵活,但是灵活的同时结构复杂性提高,开发难度也会变大,维护性降低

5、迪米特原则(law of demeter LOD)

高内聚,低耦合  -》 单一职责

6、开闭原则(open closed principle)

对扩展开放  对修改关闭
尽量不修改原来代码的情况下进行扩展(可以扩展子类)

总结

本篇仅是简单讲一下PHP最基础的语法,其他的语法就不多说了,可以去参考官方文档,或者菜鸟教程,下一篇主要把一些常用的函数整理一下,方便查询。

 类似资料: