1949啦网--小小 痛苦,是因为能力和欲望不匹配造成的

PHP回顾之PHP基础

回顾PHP的一些基础知识,权当对这么多年学习和使用PHP的提炼和总结。

PHP设计之初作为一门宏定义语言,主要用来处理网页表单,所以被设计为可以内嵌在HTML文件里。为了区分HTML代码,PHP代码块的起始界定标签是<?php,结束标签是?>(PHP5.4版本以后可以使用<?和?>短标签)。对于纯PHP文件,同样需要保留<?php作为起始标识,但建议省略结束的?>标签。

变量/常量

PHP中的变量定义需以美元符号“$”开头,例如: $name = 'qiquanji'。变量名不支持声明变量类型,大小写敏感。合法的变量名以字母、下划线开头,不能以数字、点、加减乘除等特殊符号开头,但是可以以中文汉字开头。

以下是一些变量的声明以及合法性判断:

$name = "qiquanji";   // 合法  $.name = "qiquanji";   // 非法,不能以点开头  $1234 = "qiquanji";   // 非法,不能以数字开头  $myName = "qiquanji"; // 合法  $my-name = "qiquanji"; // 非法,变量名中不能有减号  $名字 = "qiquanji";    // 合法

常量的定义方式有两种:define和const。常量名中的字母必须全部大写,可以用下划线连接。例如:

define('NAME', 'qiquanji');  // 合法  define('NAME_last', 'qiquanji');   // 非法,字母必须全部大写  define('NAME_2', 'qiquanji');     // 合法  define('NAME_中国', 'qiquanji');   // 合法  define('GENDERS', [ 0 => '女', 1 => '男',]);   // define定义常量数组,需要PHP7+    echo NAME;   // 无需加$或引号    const NAME = 'qiquanji';   // 合法,但是如果define已经定义了NAME,运行时会报错  const NAME_ADcdd = 'qiquanji';  // 非法,字母必须全部为大写    const GENDERS = [      0 => '女',      1 => '男',  ];    // const定义常量数组,需要PHP5.6+

常量定义后,不能更改和取消。defined可以判断一个常量是否定义,constant函数可以取出常量的值(效果同直接取值)。define和const的主要区别是define可以用在判断语句中,但是const不行。如果你需要灵活的方式定义变量,请使用define,否则都建议用const定义常量。

函数

函数的定义以function关键字开头,后接函数名和参数,以大括号包含的函数体结束。代码的定义形式为:

function foo($arg1, $arg2, ...)  {     // 函数体  }

函数名的要求同变量名,不能以数字开头,不能包含点、加减乘除符号等特殊符号和字符,但是可以用中文命名。不同于变量,函数名不区分大小写

函数参数可以没有,也可以有多个。支持默认参数,但是默认参数后不可出现必须传值的参数。对于基本类型,参数默认按值传递,对象和资源默认引用传参。

函数体可以为空,也可以有多个语句。可以return返回值,也可以不返回。如果函数没有返回值,则默认为null。

下面是一些函数的示例:

function printName($name = 'World')  {      echo "Hello, $name!";  }    function printName2(array $names) // array参数约束,需要PHP5.1+  {      print_r($names);  }    function printName3(array $names, callable $filter) // callable参数约束,需要PHP5.4+  {      print_r(array_map($filter, $names));  }    function sum(...$args)    // 可变参数数组,需要PHP5.6+  {      return array_sum($args);  }    function printName4(string $name = 'World') // int, float, bool参数类型提示,需要PHP7+  {      echo "Hello, $name!";  }    function getGreeting(string $name = 'World') : string  // 返回类型声明,需要PHP7+  {      return "Hello, $name!";  }    function getGreeting2(string $name = null) : ?string // 可空返回类型声明,需要PHP7.1+  {      return !$name ? null : "Hello, $name!";  }

注意如果限定传参和返回值是bool类型,应该用bool而不能使用boolean,否则运行会报错。

PHP目前为止不支持重载。一种变相的重载实现方式是: 以 …args 定义函数参数,函数体根据参数个数实现不同功能。

操作符

PHP支持常规算术运算符、赋值运算符、位运算操作符等。以下是一些示例:

$a = 2;$b = 3;    echo $a (+|-|*|/|%|**) $b;    // 加减乘除、取模、指数    ++$a; --$b;     // 自增和自减    $c = $a + $b;     // 赋值  $d = $a (&,|,^,<<, >>) $b;    // 并、或、异或、左移和右移位运算  $e = ~$a;                   // 取反    echo $a (==|===|!=|<>|<|>|<=|>=|<=>) $b;   // 比较运算符:相等、全等、不等、不等、小于、大于、小于等于、大于等于、太空符(需要PHP7+)    $str1 = 'Hello'; $str2 = 'World';  echo $str1 . ',' . $str2 . '!';   // . 作为字符串连接符  if ($a (|| , && , xor , and, or) !$b) {}   // 逻辑运算符:或、并、异或、并、或、非    $arr1 = [1, 2]; $arr2 = [3, 4];  print_r($arr1 + $arr2);   // 数组合并  var_dump($arr1 !=|!==|<>|==|=== $arr2);   // 数组比较    var_dump($arr1 instanceof int);   // instanceof操作符    @coun($arr1);          //错误控制符@。当@加在函数调用前,函数抛出的错误将被忽略    var_dump(`ls -al`);   // ``, 非单引号, shell执行符号

流程控制

PHP支持常见的分支判断、循环等流程控制。以下是一些示例:

$array = range(0, 10);  $length = count($array);  if ($length > 20) {   // if/elseif/else控制符      echo '>= 20';  } elseif ($length < 10) {      echo '< 10';  } else {      echo '10<= length < =20';  }    $index = 0;  while ($index < $length) { // while循环、continue、break     if ($index % 2 === 0) {         continue;     }     echo $array[$index], PHP_EOL;     ++ $index;     if ($index == 9) {         break;      }  }    $index = 0;    // do-while循环  do {      echo $array[$index], PHP_EOL;      ++ $index;  } while ($index < $length);    for ($index = 0; $index < $length; ++ $index) {  // for循环      echo $array[$index], PHP_EOL;  }    foreach ($array as $value) { // foreach循环      echo $value, PHP_EOL;  }    switch ($length) {  // switch      case 1:      case 3:      case 10:          echo 'A';          break;        case 4:      case 5:          echo 'B';          break;        default:          break;  }

类/接口/名字空间/特性

PHP5.3增加了名字空间和静态延迟绑定,PHP5.4增加了特性(trait)功能,标志着PHP对面向对象编程的支持进了一大步。

类在基本类型和数组上进行了拓展,丰富了编程中的类型,同时让开发人员有能力在更高层次上对问题进行建模。

PHP用class关键字对类进行定义,类中可包含属性变量、属性常量、行为方法和特性。以下是定义和使用类的示例:

class People {   // 定义一个类      const MALE = 1;      const FEMALE = 0;                // 类常量      private $age;                     // 私有属性      public $gender;                  // 共有属性      public $name;                    // 共有属性        public __construct($name, $gender = People::MALE)   // 构造函数,类常量作为默认参数,需要PHP5.6+      {          $this->name = $name;          $this->gender = $gender;      }        public function getAge()                // 共有方法      {          if ($age < 16) {              return $this->age + 2;          }          if ($age > 35) {              return $this->age - 3;          }          return $this->age;      }        private function sleep()                // 私有方法      {          ++ $this->age;      }        public function __toString()      {          return "People [ name: {$this->name}, gender: {$this->gender}]";      }  }    $me = new People('qiquanji', People::MALE);   // 实例化一个类  echo $me->name;       // 获取类的公有属性  echo $me->age;        // 非法,外部不能获取类的私有属性  echo $me->getAge();   // 调用公有方法  $me->sleep();         // 非法,外部不能调用私有方法    echo $me;             // 调用__toString方法,打印信息

__construct和__toString函数被称为“魔术方法”,常用的魔术方法还包括:__get, __set, __clone, __call等。当对类的对象发送消息时,这些魔术方法赋予拦截的机会,从而做出响应。

接口

编程中很重要的一个原则是面向接口编程,而非面向实现编程。接口规定了实现接口时必须遵守的规则,屏蔽了具体的实现细节。在与其它层交互是,只需要按照既定义的规则对接即可,从而达到解耦的目的。

在PHP中用interface关键字定义接口,接口包含的规则同定义类的成员函数相似,但是接口不能包含成员属性、常量等。以下是一个接口定义和实现:

class Message {      public $id;      public $content;      public $create_at;  }    interface Notify {      public void notify(Message msg);  }    class SmsNotify implements Notify {      public void notify(Message msg) {          // send message using the carrier api      }  }

接口中只包含规则的签名,具体实现由实现类负责。一个实现类可以同时实现多个接口。

名字空间

为了更好的组织程序代码,也为了避免类名和方法名重复,PHP在5.3版本中增加了对名字空间的支持。名字空间用namespace定义,层次用反斜杠\来分割。名字空间定义必须出现在文件的非注释第一行。以下是名字空间的示例:

// 文件名: Foo.php  namespace qiquanji;    // 定义名字空间,以下定义均位于该名字空间内    const VERSION = '1.0-SNAPSHOT';   // 定义名字空间常量    function greeting() {    // 定义名字空间函数      echo 'you are calling functions in namespace qiquanji';  }    class Foo {   // 定义名字空间中的类    }    // 在另外一个文件内使用以上定义的内容  require ('Foo.php');    use qiquanji;            // 申明使用qiquanji名字空间中  use qiquanji\Foo;        // 引入Foo类    echo qiquanji\VERSION;   // 调用名字空间中的常量    \qiquanji\greeting();     // 使用完全限定名字空间方式调用函数    $foo = new Foo();     // 调用名字空间中的类

特性

特性(trait)是为了复用程序代码,在PHP5.4中增加的新功能。PHP不能使用多继承,但是可以将一些常用的功能抽取出来做成trait,然后包含到多个类中,达到代码复用的目的。

特性用关键字trait声明,可以包含属性和方法,但不能包含常量。下面是一个示例:

trait Log {      public function log(string $message, string $category)      {          $line = "[$category]" . date('Y-m-d H:i:s') . " $message";          file_put_contents('/tmp/log.txt', $line, FILE_APPEDN);      }  }    class Foo {      use Log;    // 将特性引入  }    $foo = new Foo();    $foo->log('demo', 'application');    // 调用特性中的方法,行为如同类的成员

参考

  1. http://php.net/

  2. https://qiquanji.com/php-new-features-from-5-2-to-5-6/

原文链接:https://www.qiquanji.com/post/4842.html

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

微信扫码关注

更新实时通知

作者:xialibing 分类:网络教程 浏览: