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 魔术变量
    • 有八个魔术常量它们的值随着它们在代码中的位置改变而改变。
      • __LINE__
      • __FILE__
      • __DIR__
      • __FUNCTION__
      • __CLASS__
      • __TRAIT__
      • __METHOD__
      • __NAMESPACE__

  • PHP 命名空间(namespace)
    • 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 实体
预定义的字符是:
& (和号) 成为 &amp;
" (双引号) 成为 &quot;
' (单引号) 成为 &#039;
< (小于) 成为 &lt;
> (大于) 成为 &gt;

  • PHP includerequire 语句
    • includerequire 语句用于在执行流中插入写在其他文件中的有用的代码。
    • includerequire 除了处理错误的方式不同之外,在其他方面都是相同的:
      • require 生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行。
      • include 生成一个警告(E_WARNING),在错误发生后脚本会继续执行。
    • 包含文件省去了大量的工作。这意味着您可以为所有网页创建标准页头、页脚或者菜单文件。然后,在页头需要更新时,您只需更新这个页头包含文件即可。
include 'filename';
或者
require 'filename';
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容