一篇掌握网安所需PHP编程基础

  1. PHP代码可以放进HTML中,如下:
<!DOCTYPE html>
<html>
  <head>
      <meta charset="utf-8">
      <title>php learning</title>
  </head>
  <body>
  <h1>My first php page</h1>
  <?php
 echo "hello world";
 echo "<br>"
 ?>
   </body>
 </html> 

2.单行注释:同按Ctrl和/
多行注释:同按Ctrl和Shift和/
效果如下:
//这是单行注释
/* 这是多行注释 */
3.函数内访问全局变量;
(函数内变量不可被外部访问)

<?php
  $x=5;
  function myTest()
  {
      global $x;//关键字,函数内访问全局变量
      $y=7;
      echo "<p>测试函数内部变量<p>";
      echo "<br>";
      echo "变量x为: $x";//报错,$x前加global就不报错了,$x是函数外部变量
      echo "<br>";
      echo "变量y为: ".$y;//用点号连接,$y是函数内部变量
  }
  myTest();//函数调用
  echo "<p>测试函数外部变量<p>";
  echo "变量x为: $x";//也可以写成 echo"变量x为: ".$x;
  echo "<br>";
  //echo"变量y为: $y";//会报错,在函数外部不能访问专属函数内的变量
  ?>

在这里插入图片描述
4.函数内部利用全局变量进行运算;global
phpinfo(); 会显示PHP版本等信息

<?php
$x=4;
$y=9;
function mytest()
{
    global $x,$y;
    $y+=$x;
}
mytest();
echo $y;
phpinfo();
?>

在这里插入图片描述
又或者:

<?php
$x=5;
$y=10;
function mytest()
{
    $GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
   //echo $GLOBALS['y'];
}
mytest();
echo $y;//15
?>

5.函数中令局部变量始终保存供每次调用; static

<?php
function sta(){
    static $num=0;
    echo $num."<br>";
    $num++;
}
sta();//0
sta();//1
sta();//2
sta();//3
?>

6.形参,实参

<?php
function test($x){//形参
    echo $x;
}
test(5);//实参。传值给形参
?>

7.数组

<?php
$abc=array("apple","banana","camel");
echo "I love ".$abc[0]." "."I hate ".$abc[1]."<br>";
print "I love ".$abc[0]." "."I hate ".$abc[1]."<br>";
?>

在这里插入图片描述
8.var_dump();查看数据类型
数据类型 :string int float boolean array object Null

<?php
$abc=array("apple","banana","camel");
echo "<pre>";
var_dump($abc);
echo "</pre>";//预先定义json格式
?>

在这里插入图片描述
9.if else语句

<?php
$a=3;
if($a>1){
    echo "yes";
}else{
    echo "no";
}//yes
?>

10.while

<?php
$a=3;
while($a>0){
    echo $a;
    $a--;
}//321
?>

11.switch

<?php
$col="red";
switch ($col){
    case "red":
        echo "红色";
        break;
    case "yellow":
        echo "黄色";
        break;
    case "blue":
        echo "蓝色";
        break;
    default:
        echo "五光十色";
}//红色
?>

12.do{}while

<?php
$a=3;
do{
    echo $a;
    $a--;
}while($a>0);
?>//321

13.for

<?php
for($a=3;$a>0;$a--){
    echo $a;
}//321
?>

14.foreach循环遍历数组

<?php
$x=array("apple","banana","orange");
foreach ($x as $value){
    echo $value."<br>";//或者echo "$value<br>";
}
?>

在这里插入图片描述
15.类,对象,setName(),getName()
类中有属性和方法,好比水果类,具体的水果对象就是橘子,香蕉等,他们的名称,颜色,口味等都是水果类的属性,不同的对象对应不同的属性值;方法即函数,就是为了执行某一任务,通过被调用而完成某项功能;
setName()和getName()如何生成:在PhpStorm中鼠标右键,点击Generate->Setters and Getters->For all methods->OK

<?php
class Fruit{
    public $name;//属性
    public $color;//属性

    /**
     * @return mixed
     */
    public function getName()//方法
    {
        return $this->name;//$this引用当前对象,仅用于函数内
    }
    /**
     * @param mixed $name
     */
    public function setName($name)//方法  形参
    {
        $this->name = $name;//形参需要接收传来的实参,并将其赋值给当前对象的name属性
    }
}
$pear=new Fruit();//用类创建对象
$pear->setName("梨子");//传实参,此时$pear这个对象的属性name就是“梨子”
echo $pear->name;//梨子
echo $pear->getName();//梨子
?>

16.手动创建set方法:set_name是自己取的方法名

<?php
class Fruit{
    public $name;
    public $color;
    function set_name($name){
        $this->name=$name; 
    }
}
$pear=new Fruit();
$pear->set_name("梨子");
echo $pear->name;//梨子
?>

其实,不用set_name或setName方法,也可以直接给公共属性赋值

<?php
class Fruit{
    public $name;
    public $color;
 /*function set_name($name){
        $this->name=$name;
    }*/
}
$pear=new Fruit();
//$pear->set_name("梨子");
$pear->name="脆梨";
echo $pear->name;//脆梨 
?>

17.检查对象是否属于某类

<?php
class A{
    public $name;
}
$a=new A();
var_dump($a instanceof A);//bool(true)
?>

18.魔术方法添加:在PhpStorm中鼠标右键->Generate->Implement methods…
PHP中把以两个下划线_ _开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用。
在这里插入图片描述
19.魔术方法: _ _construct() , _ _destruct()

<?php
class Stu{
    public $name;
    public $age;
    public function sayHello(){
        echo "我叫".$this->name." 我今年".$this->age."岁啦!"."<br>";
    }
    public function __construct($name="小李子",$age=17)//构造函数,默认为空,对象第一个调用
    {
     //默认为空
        $this->name=$name;
        $this->age=$age;
    }
    public function __destruct()//销毁析构方法 用完对象后自动调用(销毁对象前的清理)
    {
        // 默认为空
        echo "对象销毁前的清理ing~<br>";
    }
}
$stu1=new Stu();//创建对象
$stu1->sayHello();//我叫小李子 我今年17岁啦!
unset($stu1);//销毁对象,自动调用__destruct() 输出:对象销毁前的清理ing~
$stu2=new Stu("杰克",22);//创建对象时,想要给对象的属性赋值或者更改属性值,前提是构造函数__construct()得非空
$stu2->sayHello();//我叫杰克 我今年22岁啦!
$stu3=new Stu("奥瑞克");//同理,前提是构造函数__construct()得非空,name由“小李子”改成“奥瑞克”,age默认是__construct中的17
$stu3->sayHello();//我叫奥瑞克 我今年17岁啦!
//现在如果运行在浏览器中,表明对象stu2和stu3停止使用了,会自动调用__destruct(),输出两遍:对象销毁前的清理ing~
?>

在这里插入图片描述
20.魔术方法:_ _call() , _ _callStatic()

<?php
class Stu{
    public $name;
    public $age;
    public function __call($name, $arguments)//默认
    {
        // 默认为空
        echo "您所调用的函数名为: ".$name."(参数: "; //输出调用的不存在的方法名
        print_r($arguments);   //输出被调用的不存在的方法时的参数列表
        echo "不存在)<br>";
    }
    public static function __callStatic($name, $arguments)//默认
    {
        //默认为空
        echo "您所调用的函数名为: ".$name."(参数: ";
        print_r($arguments);
        echo "不存在)<br>";
    }
}
$stu1=new Stu();
$stu1->sayno();//调用的__call;您所调用的函数名为: sayno(参数: Array ( ) 不存在)
$stu1->saybye("bye");//调用的__call;您所调用的函数名为: saybye(参数: Array ( [0] => bye ) 不存在)
$stu1::sayno("no");//调用的__callStatic;您所调用的函数名为: sayno(参数: Array ( [0] => no ) 不存在)
//__call 与__callStatic 都是在调用不可访问的函数时被自动调用,只是调用时格式的差别
?>

21.魔术方法:_ _set(), _ _get()

<?php
class A{
    private $name;//私有变量
    private $age;//私有变量
  public function hello(){
     echo "我是".$this->name."今年".$this->age."岁了"."<br>";
 }
   public function __set($name, $value)//默认
    {//默认为空
        $this->$name=$value;//这里的$name储存的是访问的私有变量的名称(这里$name=“name”),$value中储存的是手动传入的私有变量的值(这里$value="玲珑")
    }
   public function __get($name)//默认
    {//这里的$name用于存储想要获知的私有变量属性值的名称
        // 默认为空
        if($name=="name"){
            return $this->name;}
        else{
            return $this->age;}
    }
}
$a=new A();
$a->name="玲珑";//设置私有属性手动赋值时,会调用__set方法
$a->age="24";//设置私有属性手动赋值时,会调用__set方法
$a->hello();//我是玲珑今年24岁了
echo $a->name;//玲珑   想要获取name私有属性值,自动调用__get方法
echo $a->age;//24     想要获取age私有属性值,直接调用__get方法
?>

22.魔术方法:_ _isset(), _ _unset()
如果一个对象成员属性是公共的,就能用unset()删除对象的公有属性,但如果成员属性是私有的,照常来说是没有权限的,若将__unset()自定义的加在对象中(类中加入此方法),就可以在对象的外部去删除私有成员属性;isset()和__isset()也同理。
isset():测定某变量/成员属性是否存在,仅限公有变量/成员属性
unset():删除某变量/成员属性,仅限公有变量/成员属性

<?php
class Stu{
    private $name;
    private $age;
    private $sex;
    public function __construct($name="",$age=25,$sex="男")
    {
        $this->name=$name;
        $this->age=$age;
        $this->sex=$sex;
    }
    public function sayHello(){
        echo "姓名:".$this->name." 年龄:".$this->age." 性别:".$this->sex."<br>";
    }
    public function __isset($name)//默认
    {
        // 默认为空
        if($name=="name")
            return false;//如果是name这个私有属性,则不能用isset()测试其是否存在,返回false
        return isset($this->$name);//其余的属性可随意指定测试
    }
    public function __unset($name)//默认
    {
        // 默认为空
        if($name=="name")
            return;//退出方法,如果是name这个私有属性,则不能用unset()删除
        unset($this->$name);//其余的属性可随意指定删除
    }
}//公有属性肯定能被测定是否存在和删除,私有属性就不一定了,还得看自定义的__isset()和__unset()有没有“保护”某个私有属性
$stu1=new Stu("小荷",17,"女");
$stu1->sayHello();//姓名:小荷 年龄:17 性别:女
var_dump(isset($stu1->name));//bool(false) 无权测定name属性,因为被类中的__isset()“保护”起来了
var_dump(isset($stu1->age));//bool(true)   测定age属性存在
var_dump(isset($stu1->sex));//bool(true)  测定sex属性存在
unset($stu1->name);//无权删除该私有属性,,因为被类中的__unset()“保护”起来了
unset($stu1->age);//删除age属性成功
unset($stu1->sex);//删除sex属性成功
$stu1->sayHello();//姓名:小荷 年龄: 性别:
var_dump(isset($stu1->age));//bool(false)   测定age属性不存在
var_dump(isset($stu1->sex));//bool(false)  测定sex属性不存在
?>

23.魔术方法:_ _sleep(), _ _wakeup()
serialize()会自动调用自定义的__sleep(),serialize() 序列化,会将一个对象转换成一个字符串
unserialize()会自动调用自定义的__wakeup(),unserialize() 反序列化,会将字符串还原成一个对象

<?php
 class Stu{
  public $sex;
  private $name;
  protected $age;

  public function __construct($name="",$age=25,$sex="男")
  {
   $this->name=$name;
   $this->age=$age;
   $this->sex=$sex;
  }

  public function __sleep()
  {
    echo "在类的外部使用serialize()会调用这里的__sleep()方法";
    echo"<br>";
    $this->age=17;
    return array("name","age");
  }

  public function __wakeup()
  {
   echo "在类的外部使用unserialize()会调用这里的__wakeup()方法";
   $this->name="小荷";
   $this->sex="女";
  }

 }
 $p=new Stu("萧霖");
 echo serialize($p);//首先会调用__sleep(),之后(根据__sleep()中的return)再序列化,若没有__sleep()或没有return什么属性,则所有参数(name age sex)序列化,unserialize也同理
                    //输出:在类的外部使用serialize()会调用这里的__sleep()方法
                   //输出:O:3:"Stu":2:{s:9:"Stuname";s:6:"萧霖";s:6:"*age";i:17;}
  echo "<br>";
 $a=var_dump(serialize($p));//输出:在类的外部使用serialize()会调用这里的__sleep()方法
                        // 输出:string(61) "O:3:"Stu":2:{s:9:"Stuname";s:6:"萧霖";s:6:"*age";i:17;}"
 echo "<br>";
 var_dump(unserialize(serialize($p)));//输出:在类的外部使用serialize()会调用这里的__sleep()方法
                                     //输出:在类的外部使用unserialize()会调用这里的__wakeup()方法
                                     //输出:object(Stu)#2 (3) { ["sex"]=> string(3) "女" ["name":"Stu":private]=> string(6) "小荷" ["age":protected]=> int(17) }
?>
  • public的属性序列化,其属性名仍是本来的属性名
  • private的属性序列化,其属性名显示为 %00类名%00属性名
  • protected的属性序列化,其属性名显示为 %00*%00属性名
    以序列化输出的O:3:“Stu”:2:{s:9:“Stuname”;s:6:“萧霖”;s:6: “*age”;i:17;}为例来理解各自含义
    O:object
    3:类名长度
    “Stu”:类名
    2:显示的属性的个数
    s:属性名类型string
    9:属性名长度或随属性名更改后的长度
    “Stuname”:属性名或自动改动后的属性名
    s:属性值类型string
    6:属性值长度
    “萧霖”:属性值
    s:属性名类型string
    6:属性名长度: 1(1个 *)+2(2个%00空字符)+3(age)=6
    “*age”:属性名或自动更改的属性名
    i:属性值类型int
    17:属性值

24.魔术方法:_ _toString()
类对象想要转化成字符串被echo出,得用__toString()

<?php
class Person
{
    public $sex;
    public $name;
    public $age;
    public function __construct($name = "", $age = 25, $sex = "男")
    {
        $this->name = $name;
        $this->age = $age;
        $this->sex = $sex;
    }
    public function __toString()
    {
        return $this->name;
        //return "你好";
    }

}
$p=new Person("小米",24,"女");
print_r($p);//输出:Person Object ( [sex] => 女 [name] => 小米 [age] => 24)
echo $p;//小米      类对象想要转化成字符串被echo出,得用__toString()
?>

25.魔术方法:_ _invoke(), _ _clone()
__invoke(): 把对象当成函数去调用 会触发__invoke()方法
__clone(): 用来克隆对象

<?php
class Person
{
    public $sex;
    public $name;
    public $age;
    public function __construct($name = "", $age = 25, $sex = "男")
    {
        $this->name = $name;
        $this->age = $age;
        $this->sex = $sex;
    }

    public function __invoke()
    {//默认为空,自定义
        echo "这可是一个对象哦<br>";
    }
    public function __clone()
    {//默认为空,自定义
        echo "你正在克隆对象<br>";
    }
}
$p=new Person("小米");
$p();//输出:这可是一个对象哦   把对象当成函数去调用 会触发__invoke()方法
$q=clone $p;//输出:你正在克隆对象
var_dump($p);//输出:object(Person)#1 (3) { ["sex"]=> string(3) "男" ["name"]=> string(6) "小米" ["age"]=> int(25) }
echo "<br>";//换行
var_dump($q);//输出:object(Person)#2 (3) { ["sex"]=> string(3) "男" ["name"]=> string(6) "小米" ["age"]=> int(25) }
?>
  • 25
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

All things胜意

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值