php大法好

作者: wyude | 来源:发表于2017-03-29 11:19 被阅读0次
  • 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';

相关文章

网友评论

    本文标题:php大法好

    本文链接:https://www.haomeiwen.com/subject/fbreottx.html