简单PHP学习

 

PHP

https://www.runoob.com/try/runcode.php?filename=demo_syntax&type=php

<?php 开始,以 ?> 结束

默认扩展名是.php

每个代码行都必须以分号结束

单行注释用//或者#

多行注释用/*内容*/

变量用$定义$s=5

区分大小写    字母或下划线开始,只能由字母数字下划线构成    不能包含空格

局部和全局作用域

       在函数内定义为局部变量,函数外为全局变量

       四种作用域:local       global     static       parameter

声明变量是使用static关键字可以让变量在函数完成后不被删除

函数内引用函数外的全局变量时,需要使用global关键字

输出语句,输出语句内可以包含html标签

       Echo

              可以输出一个或者多个字符串   

$cars=array("Volvo","BMW","Toyota");

echo "我车的品牌是 {$cars[0]}";

       Print

              只允许输出一个字符串,返回值总为1

$cars=array("Volvo","BMW","Toyota");

print "我车的品牌是 {$cars[0]}";

EOF使用说明(输出)

       EOF是一种在命令行shell和程序语言里定义的一个字符串的方法

       1、后必须接分号,否则编译不通过

              <?php

              echo <<<EOF

                      <h1>我的第一个标题</h1>

                      <p>我的第一个段落。</p>

              EOF;

              // 结束需要独立一行且前后不能空格

              ?>

       2EOF可以用任意其他字符代替,只需保证前后标识一致,不在正文中出现

       3、结束标识符必须独占一行,前后不衔接任何空白和字符

       4、开始标识符可以不带引号或单双引号,一样解释内嵌的变量和转移符号,但是带单  引号时,不解释内嵌的变量和转移符号

       5、当内容需要内嵌引号时,不需要加转义符,本身对单双引号转义

PHP数据类型

       string字符串integer整型   float浮点型   boolean布尔型     array数组      object对象    null空值

       string字符串

              可以将任何文本放在引号和双引号中

       整型       没有小数的数字

              至少包含一个数字(0-9

              证书不包含逗号或者空格

              整数没有小数点

              整数可以是正数或者负数

              可以用三种格式来指定:十进制、十六进制(0x前缀)、八进制(0前缀)

       浮点型

              带小数部分的数字,或是指数形式

       布尔型

              布尔型可以是true或者false,常用于条件判断

       数组

              数组可以在一个变量中存储多个值

       对象

              可以用于存储数据,使用前需要先声明

              必须使用class关键字声明类对象,类是可以包含属性和方法的结构

              然后在类中定义数据结构,然后在实例化的类中使用数据类型

       NULL

              表示变量没有值,NULL是数据类型为NULL的值

              可以通过设置变量为NULL来清空变量数据

PHP类型比较https://www.runoob.com/php/php-types-comparisons.html

       PHP是弱类型语言,但也需要明白变量类型以及它们的意义,因为我们经常需要对PHP       变量进行比较,包含松散和严格比较

              松散比较

                     使用两个等号==比较,只比较值,不比较类型

              严格比较

                     用三个等号===比较,除了比较值,也比较类型

PHP常量       常量被定义后,整个脚本都可以使用,在任何地方都不可以改变

       由英文字母、下划线、数字组成、但数字不能是首字母,不需要修饰符$

       设置常量

              使用define()函数  define("Hello", "hello world", true);

              echo hello;

                     name必选参数,常量名称

                     value:必选参数,常量的值

                     case_insensitive:可选参数,true表示变量名大小写不敏感

       常量是全局的

              默认是全局变量,定义在函数内也可以在函数外引用

字符串变量    用于包含有字符的值,$txt="Hello world!";

并置运算符    连接字符串变量

       $txt1="Hello ";

       $txt2="World";

       echo $txt1.$txt2;    //输出Hello World

strlen()函数    输出字符串值的长度

       echo strlen("Hello world!");  //输出为12

strpos()函数   用于在字符串内查找一个字符或一段指定的文本,从0开始

       如果找到,该函数会返回第一个匹配的字符位置,如果未找到,则返回false

       echo strpos("Hello world!","world");   //输出6

运算符https://www.runoob.com/php/php-operators.html

 

赋值运算符

      

递增/递减运算符

      

比较运算符

      

逻辑运算符

      

数组运算符

      

三元运算符

组合比较符

运算符优先级

      

If...else语句    用于不同条件执行不同动作

       条件语句

              If语句                          条件成立时执行

              If...else语句                  条件成立时执行一块代码,不成立时执行另一块代码

              If...elseif...else语句        在若干条件之一成立时执行一个代码快

              Switch语句                  在若干条件之一成立时执行一个代码块

       If...elseif...else语句

              $t=date("H");       //当前时间的小时位

if ($t<"10") 

{ 

                  echo "Have a good morning!"; 

} 

elseif ($t<"20") 

{ 

               echo "Have a good day!"; 

} 

else 

{ 

    echo "Have a good night!"; 

} 

       Switch语句    根据不同条件执行不同动作

              $favcolor="red";

switch ($favcolor)

{

case "red":

                    echo "你喜欢的颜色是红色!";

                    break;

case "blue":

                  echo "你喜欢的颜色是蓝色!";

break;

default:

           echo "你喜欢的颜色不是 红, , 或绿色!";

       }

数组       能在单个变量中存储多个值的特殊变量

       数值类型       带有数字ID键的数组

       关联类型       带有指定键的数组,每个键关联一个值

       多维数组       包含一个或多个数组的数组

      

       数值数组

              自动分配ID数值

                     $cars=array("Volvo","BMW","Toyota");

              人工分配ID数值

                     $cars[0]="Volvo";

                     $cars[1]="BMW";

                     $cars[2]="Toyota";

       获取数组的长度(元素个数)  count()函数

              $cars=array("Volvo","BMW","Toyota");

              echo count($cars);

       遍历数值数组       for循环

       关联数组       使用提前赋给的值的数组

              $age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");

              echo "Peter is " . $age['Peter'] . " years old.";     //输出是35

       遍历关联数组

              $age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");

 

              foreach($age as $x=>$x_value)

              {

                   echo "Key=" . $x . ", Value=" . $x_value;

                  echo "<br>";

              }

              输出

                     Key=Peter, Value=35

                     Key=Ben, Value=37

                     Key=Joe, Value=43

数组排序       数组中的字母或者数字按照顺序进行升序或者降序

       sort()      对数组进行升序排列

       rsort()     对数组进行降序排列

       assort()   根据关联数组的值,对数组进行升序排列

       ksort()     根据关联数组的键,对数组进行升序排列

       arsort()   根据关联数组的值,对数组进行降序排列

       krsort()   根据关联数组的键,对数组进行降序排列

 

       sort()

              字母排序

                     $cars=array("Volvo","BMW","Toyota"); 

                     sort($cars); 

                     print_r($cars);

              数字排序

                     $numbers=array(4,6,2,22,11);

                     sort($numbers);

                     print_r($numbers);

       assort()   对值进行升序排序,依次374043

              $age=array("Peter"=>"40","Ben"=>"37","Joe"=>"43"); 

              asort($age); 

              print_r($age);

       ksort()     对键名进行升序排序,依次BenJoePeter

              $age=array("Peter"=>"40","Ben"=>"37","Joe"=>"43");

              ksort($age);

              print_r($age);

超级全局变量

       PHP中预定义了几个超级全局变量

       $GLOBALS     $_SERVER      $_REQUEST    $_POST   $_GET     $_FILES   $_ENV    $_COOKIE      $_SESSION

 

       $GLOBALS     包含了全部变量的全局组合数组,变量的名字就是数字的键

              $x = 75;

              $y = 25;

 

              function addition()

{

    $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];

}

 

addition();

echo $z;

       $_SERVER      包含诸如头信息、路径、脚本位置等信息的数组。

echo $_SERVER['PHP_SELF'];

echo "<br>";

echo $_SERVER['SERVER_NAME'];

echo "<br>";

echo $_SERVER['HTTP_HOST'];

echo "<br>";

             

              $_SERVER变量中的重要元素

                    

       $_REQUEST    用于收集HTML表单提交的数据

              <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">

Name: <input type="text" name="fname">

<input type="submit">

</form>

 

<?php

$name = htmlspecialchars($_REQUEST['fname']);

echo $name;

?>

      

       $_POST   广泛用于收集表单数据,在HTML form的标签指定该属性:method=POST

      

       $_GET     广泛用于收集表单数据,在HTML form标签中指定该属性:method=GET

              <a href="test_get.php?subject=PHP&web=runoob.com">Test $GET</a>

              当用户点击链接 "Test $GET", 参数 "subject" "web" 将发送至"test_get.php",            你可以在 "test_get.php" 文件中使用 $_GET 变量来获取这些数据。

              <?php           #实例test_get.php文件中的代码

              echo "Study " . $_GET['subject'] . " @ " . $_GET['web'];

              ?>

While循环

       Php循环       让相同的代码依次又一次重复的运行

              While             只要条件成立,则循环执行代码块

              do...while       首先执行依次代码块,然后在指定的条件成立时重复这个循环

              for...               循环执行代码块指定的次数

              foreach          根据数组中每个元素来循环代码块

 

              do...while语句

                     do                 //只要i=5,循环将继续运行

                     {

                          $i++;

                          echo "The number is " . $i . "<br>";

                     }

                     while ($i<=5);

             

              for循环

                     for (初始值; 条件; 增量)                   for($i=1;$i<=5;$i++)

{                                                       {

    要执行的代码;                                  echo “The number is ” . $i . ”<br>”;

}                                                       }

 

              foreach循环  每进行一次新的循环,将看到数组的下一个值

$x=array("one","two","three");

foreach ($x as $value)

{

    echo $value . "<br>";

}

 

函数

       内建函数       https://www.runoob.com/php/php-ref-array.html

       创建函数       一个简单的函数,调用时输出我的名称

function writeName()

{

    echo "Kai Jim Refsnes";

}

 

echo "My name is ";

writeName();

       添加参数

function writeName($fname)

{

    echo $fname . " Refsnes.<br>";

}

 

echo "My name is ";

writeName("Kai Jim");

echo "My sister's name is ";

writeName("Hege");

echo "My brother's name is ";

writeName("Stale");

 

两个参数

function writeName($fname,$punctuation)

{

    echo $fname . " Refsnes" . $punctuation . "<br>";

}

 

echo "My name is ";

writeName("Kai Jim",".");

echo "My sister's name is ";

writeName("Hege","!");

echo "My brother's name is ";

writeName("Ståle","?");

 

       返回值    让函数返回一个值,使用return语句

function add($x,$y)

{

    $total=$x+$y;

    return $total;

}

 

echo "1 + 16 = " . add(1,16);                     //输出1 + 16 =17

 

魔术常量

       _LINE_    _FILE_     _DIR_      _FUNCTION_         _CLASS_        _TRAIT_          _METHOD_

       _NAMESPACE_

 

       _LINE_    文件中的行数

              <?php

              echo '这是第 " '  . __LINE__ . ' " ';        //输出这是第 " 2 "

              ?>

 

       _FILE_     文件的完整路径和文件名

              <?php

              echo '该文件位于 " '  . __FILE__ . ' " ';

              ?>                                      //输出该文件位于 “ E:\wamp\www\test\index.php ”

 

       _DIR_      文件所在的目录。如果被包含在文件中,则返回被包含的文件所在的目录

       echo '该文件位于 " '  . __DIR__ . ' " ';       等价于dirname(_DIR_)

 

       _FUNCTION_         函数名称

function test() {

    echo  '函数名为:' . __FUNCTION__ ;     

}

test();

 

       _CLASS_        类的名称

class test {

    function _print() {

        echo '类名为:'  . __CLASS__ . "<br>";

        echo  '函数名为:' . __FUNCTION__ ;            

    }

}

$t = new test();

$t->_print();

 

       _METHOD_           类的方法名

function test() {

    echo  '函数名为:' . __METHOD__ ;

}

test();

 

       _NAMESPACE_      当前命名空间的名称(区分大小写)

namespace MyProject;

 

echo '命名空间为:"', __NAMESPACE__, '"'; // 输出 "MyProject"

 

命名空间PHP_命名空间.html

       定义命名空间       子命名空间    命名空间使用       命名空间和动态语言特征

       Namespace关键字和_NAMESPACE_常量               使用命名空间:别名导入

       使用命名空间:后备全局函数/常量         全局空间              命名空间的顺序

 

       定义命名空间       通过namespace关键字声明,如果一个文件包含命名空间,必须在                               全部代码前声明命名空间

namespace MyProject {

    const CONNECT_OK = 1;

    class Connection { /* ... */ }

    function connect() { /* ... */  }

}                                                              //在单文件中定义多个命名空间,建议使                                                         用大括号形式的语法

namespace AnotherProject {

    const CONNECT_OK = 1;

    class Connection { /* ... */ }

function connect() { /* ... */  }

 

              将全局的非命名空间中的代码与命名空间中的代码组合在一起,只能使用大括号的              写法,全局代码必须使用一个不带名称的namespace语句加上大括号括起来

namespace MyProject {

 

const CONNECT_OK = 1;

class Connection { /* ... */ }

function connect() { /* ... */  }

}

 

namespace { // 全局代码

session_start();

$a = MyProject\connect();

echo MyProject\Connection::start();

}

 

              声明命名空间前唯一合法的代码就是定义源文件编码方式的declare语句,所有非         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();

}

 

       命名空间的使用

1、非限定名称,或不包含前缀的类名称

例如:$a=new foo();foo::staticmethod(); 如果当前命名空间是currentnamespacefoo将解析为currentnamespace\foo,如果使用foo的代码是全局的,不包含在任何命名空间的代码,则foo会被解析为foo

如果命名空间中的函数或变量未定义,则该非限定的函数名臣干活常量名称会被解析为全局函数名称或常量名称

 

2、限定名称,或包含前缀的名称

例如:·$a=new subnamespace\foo();subnamespace\foo::staticmethod();如果当前的命名空间是currentnamespace,则foo会被解析为currentnamespace\subnamespace\foo。如果使用foo的代码是全局的,不包含在任何命名空间中的代码,foo会被解析为subnamespace\foo

 

3、完全限定名称,或包含了全局前缀操作符的名称

例:$a=new \currentnamespace\foo();\currentnamespace\foo::staticmethod();在这种情况下,foo总是被解析为代码中的文字名(literal name)currentnamespace\foo

 

面向对象       对现实世界的抽象

       对象的行为    对对象施加的操作

       对象的形态    当施加那些方法时,对象如何响应

       对象的表示    相同的行为与状态下有什么不同

      

       面向对象内容

                                定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据                                   的操作。

              对象              是类的实例。

              成员变量       定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成                                   员函数访问,在类被实例化为对象后,该变量即可称为对象的属性。

              成员函数       定义在类的内部,可用于访问对象的数据。

              继承              继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一                                   种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基                                   础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,                                并加入若干新的内容。

              父类              一个类被其他类继承,可将该类称为父类,或基类,或超类。

              子类              一个类继承其他类称为子类,也可称为派生类。

              多态              多态性是指相同的函数或方法可作用于多种类型的对象上并获得不                                同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现                                   象称为多态性。

              重载              简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情                                   形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数                                   或者方法。

              抽象性           抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽                                   象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,                                而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体                                   的应用有关。

              封装              封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并                                   放置在一个逻辑单元内。

              构造函数       主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,                              总与new运算符一起使用在创建对象的语句中。

              析构函数       析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例                                 如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数                              往往用来做"清理善后" 的工作(例如在建立对象时用new开辟了一                               片内存空间,应在退出前在析构函数中用delete释放)。           

 

       创建对象       类创建后,用new运算符来实例化该类的对象

<?php

class Site {

  /* 成员变量 */

  var $url;

  var $title;

  

  /* 成员函数 */

  function setUrl($par){

     $this->url = $par;

  }

  

  function getUrl(){

     echo $this->url . PHP_EOL;

  }

  

  function setTitle($par){

     $this->title = $par;

  }                                                                                            

  

  function getTitle(){

     echo $this->title . PHP_EOL;

  }

}

 

$runoob = new Site;

 

// 调用成员函数,设置标题和URL

$runoob->setTitle( "菜鸟教程" );

 

$runoob->setUrl( 'www.runoob.com' );

 

// 调用成员函数,获取标题和URL

$runoob->getTitle();

 

$runoob->getUrl();

?

 

       构造函数       构造函数是一种特殊的方法。主要用来初始化对象,为对象赋初始值

<?php

class Site {

  /* 成员变量 */

  var $url;

  var $title;

 

  function __construct( $par1, $par2 ) {

    $this->url = $par1;

    $this->title = $par2;

  }

  /* 成员函数 */

  function setUrl($par){

     $this->url = $par;

  }

 

  function getUrl(){

     echo $this->url . PHP_EOL;                    //现在我们就不需要调用setTitle

  }                                                                  setUrl方法了

 

  function setTitle($par){

     $this->title = $par;

  }

 

  function getTitle(){

     echo $this->title . PHP_EOL;

  }

}

 

$runoob = new Site('www.runoob.com', '菜鸟教程');

 

// 调用成员函数,获取标题和URL

$runoob->getTitle();

 

$runoob->getUrl();

?>

 

       析构函数       与构造函数相反,当对象结束生命周期时,系统自动执行析构函数

              void __destruct ( void )

             

              实例:

<?php

class MyDestructableClass {

   function __construct() {

       print "构造函数\n";

       $this->name = "MyDestructableClass";

   }

 

 

   function __destruct() {

       print "销毁 " . $this->name . "\n";

   }

}

 

$obj = new MyDestructableClass();

?>

 

       继承       使用关键字extends来继承一个类,PHP不支持多继承

<?php

// 继承了Site类,并拓展了功能

class Child_Site extends Site {

   var $category;

 

    function setCate($par){

        $this->category = $par;

    }

 

    function getCate(){

        echo $this->category . PHP_EOL;

    }

}

 

       方法重写       父类的方法不能满足子类的需求,可以对其进行过改写

实例(改写了getUrlgetTitle的方法)

function getUrl() {

   echo $this->url . PHP_EOL;

   return $this->url;

}

  

function getTitle(){

   echo $this->title . PHP_EOL;

   return $this->title;

}

 

       访问控制       PHP对属性或方法的访问控制,在前面添加public(公有)、protected(受                           保护)和private(私有)

              Public(公有)                   公有的类成员可以在任何地方被访问

              Protected(受保护)          受保护的类则可以被自身以及其子类和父类访问

              Private(私有)                  私有的类成员则只能被其定义所在的类访问

             

              类属性必须定义为公有,受保护或私有之一,如果没有定义或用var定义,则被视        为公有

<?php

/**

 * Define MyClass

 */

class MyClass

{

    // 声明一个公有的构造函数

    public function __construct() { }

 

    // 声明一个公有的方法

    public function MyPublic() { }

 

    // 声明一个受保护的方法

    protected function MyProtected() { }

 

    // 声明一个私有的方法

    private function MyPrivate() { }

 

    // 此方法为公有

    function Foo()

    {

        $this->MyPublic();

        $this->MyProtected();

        $this->MyPrivate();

    }

}

 

$myclass = new MyClass;

$myclass->MyPublic(); // 这行能被正常执行

$myclass->MyProtected(); // 这行会产生一个致命错误

$myclass->MyPrivate(); // 这行会产生一个致命错误

$myclass->Foo(); // 公有,受保护,私有都可以执行

 

 

/**

 * Define MyClass2

 */

class MyClass2 extends MyClass

{

    // 此方法为公有

    function Foo2()

    {

        $this->MyPublic();

        $this->MyProtected();

        $this->MyPrivate(); // 这行会产生一个致命错误

    }

}

 

$myclass2 = new MyClass2;

$myclass2->MyPublic(); // 这行能被正常执行

$myclass2->Foo2(); // 公有的和受保护的都可执行,但私有的不行

 

class Bar

{

    public function test() {

        $this->testPrivate();

        $this->testPublic();

    }

 

    public function testPublic() {

        echo "Bar::testPublic\n";

    }

   

    private function testPrivate() {

        echo "Bar::testPrivate\n";

    }

}

 

class Foo extends Bar

{

    public function testPublic() {

        echo "Foo::testPublic\n";

    }

   

    private function testPrivate() {

        echo "Foo::testPrivate\n";

    }

}

 

$myFoo = new foo();

$myFoo->test(); // Bar::testPrivate

                // Foo::testPublic

?>

       接口       可以指定某个类实现那些方法,但不需要定义这些方法的具体内容

              使用interface关键字定义,接口中的所有方法都必须是公有的,用implements         作符实现,实现多个接口用逗号来间隔

<?php

 

// 声明一个'iTemplate'接口

interface iTemplate

{

    public function setVariable($name, $var);

    public function getHtml($template);

}

 

 

// 实现接口

class Template implements iTemplate

{

    private $vars = array();

 

    public function setVariable($name, $var)

    {

        $this->vars[$name] = $var;

    }

 

    public function getHtml($template)

    {

        foreach($this->vars as $name => $value) {

            $template = str_replace('{' . $name . '}', $value, $template);

        }

 

        return $template;

    }

}

 

       常量       在类中始终保持不变的值定义为常量,但定义和使用常量不需要使用$符号

                     常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用

                     Const changliang = 3;

 

       抽象类    任何一个类,如果它里面至少有一个方法被声明为抽象的, 那么这个类就必                须被声明成抽象的,定义为抽象的类不能被实例化

                     继承一个抽象类时,子类必须定义父类中的所有抽象方法,这些方法的访问                         控制必须和父类中一样(或更为宽松),比如父类受保护,子类必须是受保护                或者公有

<?php

abstract class AbstractClass

{

    // 我们的抽象方法仅需要定义需要的参数

    abstract protected function prefixName($name);

 

 

}

 

class ConcreteClass extends AbstractClass

{

 

    // 我们的子类可以定义父类签名中不存在的可选参数

    public function prefixName($name, $separator = ".") {

        if ($name == "Pacman") {

            $prefix = "Mr";

        } elseif ($name == "Pacwoman") {

            $prefix = "Mrs";

        } else {

            $prefix = "";

        }

        return "{$prefix}{$separator} {$name}";

    }

}

 

$class = new ConcreteClass;

echo $class->prefixName("Pacman"), "\n";

echo $class->prefixName("Pacwoman"), "\n";

?>

 

       Static关键字  声明属性或方法为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关键字   如果父类中的方法被声明为final,则子类无法覆盖该方法,如果一个类被                            声明为final,则不能被继承

<?php

class BaseClass {

   public function test() {

       echo "BaseClass::test() called" . PHP_EOL;

   }

  

   final public function moreTesting() {

       echo "BaseClass::moreTesting() called"  . PHP_EOL;

   }

}

 

class ChildClass extends BaseClass {

   public function moreTesting() {

       echo "ChildClass::moreTesting() called"  . PHP_EOL;

   }

}

// 报错信息 Fatal error: Cannot override final method BaseClass::moreTesting()

?>

 

       调用父类构造方法       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();

 

// 调用 BaseClassSubClass 构造方法

$obj = new SubClass();

 

// 调用 BaseClass 构造方法

$obj = new OtherSubClass();

?>

 

PHP表单       $_GET$_POST变量用于检索表单中的信息,比如用户输入

       处理HTML表单时,PHP能把来自HTML页面的表单元素自动变成可供PHP脚本使用

 

       HTML代码                                       PHP文件代码

<html>                                             欢迎<?php echo $_POST["fname"]; ?>!<br>

<head>                                            你的年龄是 <?php echo $_POST["age"]; ?>  岁。

<meta charset="utf-8">

<title>菜鸟教程(runoob.com)</title>

</head>

<body>

 

<form action="welcome.php" method="post">

名字: <input type="text" name="fname">

年龄: <input type="text" name="age">

<input type="submit" value="提交">

</form>

 

</body>

</html>

 

PHP下拉菜单的数据

       下拉菜单单选

              <form action="" method="get">

    <select name="q">

    <option value="">选择一个站点:</option>

    <option value="RUNOOB">Runoob</option>

    <option value="GOOGLE">Google</option>

    <option value="TAOBAO">Taobao</option>

    </select>

    <input type="submit" value="提交">

</form>

 

       下拉菜单多选

       <form action="" method="post">

    <select multiple="multiple" name="q[]">

    <option value="">选择一个站点:</option>

    <option value="RUNOOB">Runoob</option>

    <option value="GOOGLE">Google</option>

    <option value="TAOBAO">Taobao</option>

    </select>

    <input type="submit" value="提交">

    </form>

 

       单选按钮表单

       <form action="" method="get">

    <input type="radio" name="q" value="RUNOOB" />Runoob

    <input type="radio" name="q" value="GOOGLE" />Google

    <input type="radio" name="q" value="TAOBAO" />Taobao

    <input type="submit" value="提交">

       </form>

 

       Checkbox复选框

       <form action="" method="post">

    <input type="checkbox" name="q[]" value="RUNOOB"> Runoob<br>

    <input type="checkbox" name="q[]" value="GOOGLE"> Google<br>

    <input type="checkbox" name="q[]" value="TAOBAO"> Taobao<br>

    <input type="submit" value="提交">

       </form>

 

       表单验证

              我们应该尽可能的对用户的输入进行验证(通过客户端脚本)。浏览器验证速度更         快,并且可以减轻服务器的压力

              如果用户输入需要插入数据库,应该考虑使用服务器验证,在服务器验证表单的一              种比较好的方式就是把表单的数据传给当前页面(一部提交的方式更好)而不是跳              转到不同页面,这样用户可以在同一张表单页面得到错误信息,更容易发现错误

 

表单验证       在处理表单的时候我们需要考虑安全性

       为了防止黑客及垃圾信息,我们需要对数据进行安全验证

htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。

预定义的字符是:

& (和号)   成为 &amp;

" (双引号) 成为 &quot;

' (单引号) 成为 &#039;

< (小于)成为 &lt;

> (大于)   成为 &gt;

      

       表单中需要引起注重的地方

              $_SERVER[“PHP_SELF”]变量可能会被黑客使用

              当黑客使用跨站脚本的HTTP链接来攻击时,$_SERVER[“PHP_SELF”]服务器变量也         会被植入脚本,原因就是跨站脚本是负载执行文件的路径后面的,因此                            $_SERVER[“PHP_SELF”]的字符串就会包含HTTP连接后面的JavaScript程序代码

             

              XSS又叫CSScross -site script)跨站脚本攻击。恶意攻击者往web页面里插入恶              html代码,当用户浏览该页时,嵌入其其中web里面的html代码就会被执行,         从而达到恶意用户的特殊目的

 

              $_SERVER[“PHP_SELF”]可以通过htmlspecialchars()函数来避免被利用

              Form代码如下

   <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

              Htmlspecialchars()把一些预定义的字符转换为html实体

 

       使用PHP验证表单数据

              先对用户所有提交的数据通过PHPhtmlspecialchars()函数处理

              当用户提交表单时      

       1、使用PHP trim()函数去除用户输入数据中不必要的字符(比如:空格,tab,换行)

       2、使用PHP stripslashes()函数去除用户输入数据中的反斜杠(\

 

接下来让我们将这些过滤的函数写在一个我们自己定义的函数中,这样可以大大提高代码的复用性。

将函数命名为 test_input()

现在,我们可以通过test_input()函数来检测 $_POST 中的所有变量, 脚本代码如下所示:

 

实例

<?php

// 定义变量并默认设置为空值

$name = $email = $gender = $comment = $website = "";

 

if ($_SERVER["REQUEST_METHOD"] == "POST")

{

  $name = test_input($_POST["name"]);

  $email = test_input($_POST["email"]);

  $website = test_input($_POST["website"]);

  $comment = test_input($_POST["comment"]);

  $gender = test_input($_POST["gender"]);

}

 

function test_input($data)

{

  $data = trim($data);

  $data = stripslashes($data);

  $data = htmlspecialchars($data);

  return $data;

}

?>

              执行以上脚本时,会通过$_SERVER[“REQUEST_METHOD”]来检测表单是否被提交,              如果REQUEST_METHODPOST,表单会被提交-数据被验证,如果表单未提交将        跳过验证并显示空白

       表单必需字段

              <?php

// 定义变量并默认设为空值

$nameErr = $emailErr = $genderErr = $websiteErr = "";

$name = $email = $gender = $comment = $website = "";

 

if ($_SERVER["REQUEST_METHOD"] == "POST") {

  if (empty($_POST["name"])) {

    $nameErr = "名字是必需的。";

  } else {

    $name = test_input($_POST["name"]);

  }

 

  if (empty($_POST["email"])) {

    $emailErr = "邮箱是必需的。";

  } else {

    $email = test_input($_POST["email"]);

  }

 

  if (empty($_POST["website"])) {

    $website = "";

  } else {

    $website = test_input($_POST["website"]);

  }

 

  if (empty($_POST["comment"])) {

    $comment = "";

  } else {

    $comment = test_input($_POST["comment"]);

  }

 

  if (empty($_POST["gender"])) {

    $genderErr = "性别是必需的。";

  } else {

    $gender = test_input($_POST["gender"]);

  }

}

?>

       显示错误信息       为每个字段中添加了一些脚本,各个脚本会在信息输入错误时显示错                                   误信息(如果用户未填信息就提交表单则会输出错误信息)

    <form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>">

   名字: <input type="text" name="name">

   <span class="error">* <?php echo $nameErr;?></span>

   <br><br>

   E-mail: <input type="text" name="email">

   <span class="error">* <?php echo $emailErr;?></span>

   <br><br>

   网址: <input type="text" name="website">

   <span class="error"><?php echo $websiteErr;?></span>

   <br><br>

   备注: <textarea name="comment" rows="5" cols="40"></textarea>

   <br><br>

   性别:

   <input type="radio" name="gender" value="female">

   <input type="radio" name="gender" value="male">

   <span class="error">* <?php echo $genderErr;?></span>

   <br><br>

   <input type="submit" name="submit" value="Submit">

       </form>

 

验证邮件和URL

       验证名称

              $name = test_input($_POST["name"]);

              if (!preg_match("/^[a-zA-Z ]*$/",$name)) {              //preg_match进行正则式匹配

              $nameErr = "只允许字母和空格";

              }

 

       验证邮件

$email = test_input($_POST["email"]);

if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) {

  $emailErr = "非法邮箱格式";

}

 

       验证URL

$website = test_input($_POST["website"]);

if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {

  $websiteErr = "非法的 URL 的地址";

}

 

完整表单实例完整表单实例

       表单中确保输入值

              在用户点击提交按钮后,为确保字段值是否输入正确,我们在HTMLinput元素        中插添加PHP脚本

 

$_GET变量    用于收集来自method=”get”的的表单中的值

       从带有GET方法的表单发送的信息,对任何人哦都是可见的(会显示在地址栏),并且对发送信息的量也有限制

              <html>

<head>

<meta charset="utf-8">

<title>菜鸟教程(runoob.com)</title>

</head>

<body>

 

<form action="welcome.php" method="get">

名字: <input type="text" name="fname">

年龄: <input type="text" name="age">

<input type="submit" value="提交">

</form>

</body>                                    服务器welcome.phpurl显示为

</html>                                     http://localhost/welcome.php?fname=1&age=1

 

              Welcome.php

              欢迎 <?php echo $_GET["fname"]; ?>!<br>

              你的年龄是 <?php echo $_GET["age"]; ?> 

             

              在发送密码或其他敏感信息时,不应该使用get方法

              因为显示url,收藏夹里存取反而方便

              不适合大型变量值,它的值不超过2000个字符

 

$_POST变量         $_POST变量用于收集来自method=”POST”的表单的值

       从带POST方法的表单中发送的信息,对任何人都是不可见的(不会显示在地址栏),   并且对发送信息的量也没有限制

      

       然而,默认情况下,POST方法的发送信息的量的最大值为8MB(可以通过更改php.ini文件内的post_max_size进行设置)

      

html>

<head>

<meta charset="utf-8">

<title>菜鸟教程(runoob.com)</title>

</head>

<body>

 

<form action="welcome.php" method="post">

名字: <input type="text" name="fname">

年龄: <input type="text" name="age">

<input type="submit" value="提交">

</form>

</body>                             服务器welcome.phpurl显示为

</html>                              http://localhost/welcome.php

 

              从带有post发放的表单发送的信息,对任何人都是不可见的,并且对发送信息的          量也不限制。

              然而,由于变量不显示在url中,所以无法将网页加入书签

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-12-04 20:30  erroro  阅读(516)  评论(0)    收藏  举报