php大法好
- PHP 是服务器端脚本语言;
- PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言;
- PHP 文件可包含文本、HTML、JavaScript代码和 PHP 代码;
- PHP 代码在服务器上执行,结果以纯 HTML 形式返回给浏览器?
- php在win下环境配置:
- 下载php
- 添加环境变量
- 开启php自带简易服务器(下载apache什么的太麻烦,我就是玩玩):
php -S localhost:8000 -t 页面所在路径
//在页面根目录运行
php -S localhost:2001
- 在目录中创建phptest.php
<!DOCTYPE html>
<html>
<body>
<?php
echo("hollo world");
?>
</body>
</html>
- 浏览器验证:
localhost:2001/phptest.php
PHP 语法
- PHP 脚本在服务器上执行,然后将纯 HTML 结果发送回浏览器。
- PHP 脚本可以放在文档中的任何位置。
- PHP 脚本以 <?php 开始,以 ?> 结束:
<?php
// PHP 代码
?>
- php变量
- 变量以 $ 符号开始,后面跟着变量的名称;
- 变量名是区分大小写的($y 和 $Y 是两个不同的变量);
-
global
关键字用于函数内访问全局变量,在函数内调用函数外定义的全局变量,我们需要在函数中的变量前加上global
关键字; - PHP 将所有全局变量存储在一个名为
$GLOBALS[index]
的数组中。index
保存变量的名称。这个数组可以在函数内部访问,也可以直接用来更新全局变量; -
Static
作用域
<?php
function myTest()
{
static $x=0;
echo $x;
$x++;
}
myTest();
myTest();
myTest();
?>
- PHP 常量:使用 define() 函数,函数语法如下:
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] );
该函数有三个参数:
name:必选参数,常量名称,即标志符。
value:必选参数,常量的值。
case_insensitive :可选参数,如果设置为 TRUE,该常量则大小写不敏感。默认是大小写敏感的。
- PHP 是一门弱类型语言。
- PHP echo 和 print 语句
-
echo
可以输出一个或多个字符串; -
print
只允许输出一个字符串,返回值总为 1; -
echo
输出的速度比print
快,echo
没有返回值,print
有返回值1
。
-
- 组合比较符(php7+)
<=>
$a = $b <=> $c;//if $b<$c,$a=-1;if$b==$c,$a=0;if$b>$c,$a=1
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
-
=>
,->
,::
=>
用在php数组键名与元素的连接符,如:
$arr = array(
'a'=>'123',
'b'=>'456'
);
foreach($arr as $key=>$val){
//$key是数组键名
//$val是数组键名对应的值
}
-
->
:类似于C
中对象对属性的引用; -
::
: 在PHP中::
这个叫范围解析操作符,又名域运算符。像C++的::类范围操作符。php调用类的内部静态成员,或者是类之间调用就要用。
- PHP 超级全局变量
- PHP中
预定义
了几个超级全局变量(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用。 你不需要特别说明,就可以在函数及类中使用。- $GLOBALS
- $_SERVER
- $_REQUEST
- $_POST
- $_GET
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION
- PHP_EOL 为换行符
- PHP中
- PHP 魔术变量
- 有八个魔术常量它们的值随着它们在代码中的位置改变而改变。
- __LINE__
- __FILE__
- __DIR__
- __FUNCTION__
- __CLASS__
- __TRAIT__
- __METHOD__
- __NAMESPACE__
- 有八个魔术常量它们的值随着它们在代码中的位置改变而改变。
- PHP 命名空间(namespace)
- PHP 命名空间可以解决以下两类问题:
- 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
- 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
- 如果一个文件中包含命名空间,它必须在其它所有代码之前声明
- PHP 命名空间可以解决以下两类问题:
< ?php
// 定义代码在 'MyProject' 命名空间中
namespace MyProject;
// ... 代码 ...
- 也可以在同一个文件中定义不同的命名空间代码,如:
< ?php
namespace MyProject1;
// MyProject1 命名空间中的PHP代码
namespace MyProject2;
// MyProject2 命名空间中的PHP代码
// 另一种语法
namespace MyProject3 {
// MyProject3 命名空间中的PHP代码
}
?>
- 在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前。
<?php
declare(encoding='UTF-8'); //定义多个命名空间和不包含在命名空间中的代码
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace { // 全局代码
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>
- 子命名空间
- 与目录和文件的关系很象,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:
<?php
namespace MyProject\Sub\Level; //声明分层次的单个命名空间
const CONNECT_OK = 1;
class Connection { /* ... */ }
function Connect() { /* ... */ }
?>
上面的例子创建了常量 MyProject\Sub\Level\CONNECT_OK,
类 MyProject\Sub\Level\Connection
函数 MyProject\Sub\Level\Connect
- 使用命名空间:别名/导入
- 使用use操作符导入/使用别名
<?php
namespace foo;
use My\Full\Classname as Another;
// 下面的例子与 use My\Full\NSname as NSname 相同
use My\Full\NSname;
// 导入一个全局类
use \ArrayObject;
$obj = new namespace\Another; // 实例化 foo\Another 对象
$obj = new Another; // 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象
// 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象
?>
- 一行中包含多个use语句
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
?>
- 卧槽,太多了,先不看命名空间这部分了。
- php面向对象
- 类内变量使用
var
来声明, 变量也可以初始化值; - 构造函数
void __construct ([ mixed $args [, $... ]] )
- 类内变量使用
function __construct( $par1, $par2 ) {
$this->url = $par1;
$this->title = $par2;
}
- 析构函数`void __destruct ( void )`当对象结束其生命周期时,系统自动执行析构函数。
<?php
class MyDestructableClass {
function __construct() {
print "构造函数\n";
$this->name = "MyDestructableClass";
}
function __destruct() {
print "销毁 " . $this->name . "\n";
}
}
$obj = new MyDestructableClass();
?>
- 继承
PHP 使用关键字extends
来继承一个类,PHP 不支持多继承
class Child extends Parent {
// 代码部分
}
- 方法重写
如果从父类继承的方法不能满足子类的需求,可以对其进行改写,
这个过程叫方法的覆盖(override),也称为方法的重写
- 访问控制
PHP 对属性或方法的访问控制,是通过在前面添加关键字
public(公有),protected(受保护)或 private(私有)来实现的。
默认公有。
- 接口
使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
接口中定义的所有方法都必须是公有,这是接口的特性。
要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。
<?php
// 声明一个'iTemplate'接口
interface iTemplate{
}
// 实现接口
class Template implements iTemplate{
}
- 常量
可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号。
常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。
自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字(如 self,parent 或 static)。
<?php
class MyClass
{
const constant = '常量值';
function showConstant() {
echo self::constant . PHP_EOL;
}
}
echo MyClass::constant . PHP_EOL;
$classname = "MyClass";
echo $classname::constant . PHP_EOL; // 自 5.3.0 起
$class = new MyClass();
$class->showConstant();
echo $class::constant . PHP_EOL; // 自 PHP 5.3.0 起
?>
- 抽象类
任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
定义为抽象的类不能被实例化。
被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)
<?php
abstract class AbstractClass{
// 强制要求子类定义这些方法
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// 普通方法(非抽象方法)
public function printOut() {
print $this->getValue() . PHP_EOL;
}
}
class ConcreteClass1 extends AbstractClass{
protected function getValue() {
return "ConcreteClass1";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}
- Static 关键字
声明类属性或方法为 static(静态),就可以不实例化类而直接访问。
静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。
静态属性不可以由对象通过 -> 操作符来访问。
自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static
<?php
class Foo {
public static $my_static = 'foo';
public function staticValue() {
return self::$my_static;
}
}
print Foo::$my_static . PHP_EOL;
$foo = new Foo();
print $foo->staticValue() . PHP_EOL;
?>
- Final 关键字
PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。
- 调用父类构造方法
PHP 不会在子类的构造方法中自动的调用父类的构造方法。要执行父类的构造方法,需要在子类的构造方法中调用 parent::__construct()
。
<?php
class BaseClass {
function __construct() {
print "BaseClass 类中构造方法" . PHP_EOL;
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct(); // 子类构造方法不能自动调用父类的构造方法
print "SubClass 类中构造方法" . PHP_EOL;
}
}
class OtherSubClass extends BaseClass {
// 继承 BaseClass 的构造方法
}
// 调用 BaseClass 构造方法
$obj = new BaseClass();
// 调用 BaseClass、SubClass 构造方法
$obj = new SubClass();
// 调用 BaseClass 构造方法
$obj = new OtherSubClass();
?>
- 表单验证
- 应该在任何可能的时候对用户输入进行验证(通过客户端脚本)。浏览器验证速度更快,并且可以减轻服务器的负载。
- 如果用户输入需要插入数据库,您应该考虑使用服务器验证。在服务器验证表单的一种好的方式是,把表单传给它自己,而不是跳转到不同的页面。这样用户就可以在同一张表单页面得到错误信息。用户也就更容易发现错误了。
- htmlspecialchars
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体
预定义的字符是:
& (和号) 成为 &
" (双引号) 成为 "
' (单引号) 成为 '
< (小于) 成为 <
> (大于) 成为 >
- PHP
include
和require
语句-
include
和require
语句用于在执行流中插入写在其他文件中的有用的代码。 -
include
和require
除了处理错误的方式不同之外,在其他方面都是相同的:-
require
生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行。 -
include
生成一个警告(E_WARNING),在错误发生后脚本会继续执行。
-
- 包含文件省去了大量的工作。这意味着您可以为所有网页创建标准页头、页脚或者菜单文件。然后,在页头需要更新时,您只需更新这个页头包含文件即可。
-
include 'filename';
或者
require 'filename';