m0re
开始水博客了咕咕
跟着Mochazz师傅的博客学习

0x01类

关于PHP的类,由class关键字创建,然后使用new关键字实例化对象。其中变量称为属性,函数称为方法。

0x02 类成员的访问控制

Public:可以在任何地方被访问
Protected:可被其所在的类的子类和父类访问
Private:只能在类内部被访问,子类不能访问父类的私有属性
如未声明,默认为public

0x03 常量

使用const定义类常量
使用this关键字在类内部访问成员变量和方法

0x04 构造函数和析构函数

关于构造函数和析构函数的区别

<?php
    class animals
    {
      private $name;
      function __construct($value1,$value2)//可以有参数
      {
        //echo "构造函数<br>";
      }
      function __destruct()//不可以有参数
      {
        //echo "析构函数<br>";
      }
    }
    $dog = new animals();
?>

构造函数在使用new关键字创建对象时自动执行,可传入参数;析构函数在对象被销毁时自动执行,不能有参数。

0x05 clone一个对象

clone是将原对象的所有信息从内存中复制一份,存储在信开辟的内存中。

0x06 继承

<?php
    class admin{
      public $user;
      public function __construct($name){
        $this->name = $name;
      }
      public function manager()
      {
        echo "I am {$this->name}.<br>";
      }
    }
    class user extends admin{
      function who(){
        echo "manager of here";
      }
    }
    $user1 = new user("m0re");
    $user1->manager();
    $user1->who();
?>

0x07 魔术方法

__clone()方法

__clone方法会重写clone,当使用clone时,不仅会复制变量,还会执行__clone里面的代码
对象复制可以通过clone关键字来完成(如果可能,这将调用对象的 __clone() 方法)。对象中的 __clone() 方法不能被直接调用。

<?php
    class Person
    {
      public $name;
      public function __clone()
    {
      echo "正在clone对象";
    }
    }
    $stu = new Person();
    $stu2 = $stu;
    $stu3 = clone $stu;
?>

__toString()

<?php
    class Person{
      public function __toString()
      {
        return "I am __toString().";
      }
    }
    echo $person = new Person();
?>

__autoload()

__autoload()方法会在第一次引用一个类时调用该方法,可以通过定义这个函数来启用类的自动加载

#Person.class.php
<?php
    class Person{
      function say()
      {
        echo "Hello,world";
      }
    }
?>
#flag.php
<?php
function __autoload($classname)
{
    include($classname.".class.php");
}
$person = new Person();
$person->say();

json数据

json_decode(string,bool)当第二个参数为true时,返回一个数组,默认为false返回一个对象。

<?php
    $arr1 = array("one"=>"1","two"=>"2","three"=>"3");
    $arr2 = array("one","two","three");
    var_dump(json_encode($arr1));
    var_dump(json_decode(json_encode($arr1)));
    var_dump(json_decode(json_encode($arr1),true));
    var_dump(json_decode(json_encode($arr2)));
?>

抽象类

使用关键字abstract来声明一个抽象类以及抽象方法。抽象类不能实例化对象,子类继承抽象父类后,子类中必须有父类中的抽象方法。抽象类起到规定子类结构的作用,子类必须给出父类抽象方法的实现。

在子类中必须重写父类的抽象方法,否则会报错。

接口

接口是一种特殊的抽象类,使用关键字interface来声明一个接口,不能实例化对象。接口中的方法必须全是抽象方法成员属性必须是常量。所有的权限必须是public,由子类来拓展。使用implements代替extends来实现接口,一个类只能继承一个父类,但是可实现多个接口。如果一个类同时使用了继承父类和实现接口,必须先继承再实现。

<?php
    interface example{
      const NAME = "lisi";
      const AGE = "120";
      public function student();
    }
    interface example2 extends example{
      public function worker();
    }
    class Person{
      function child(){
        echo "hhhhhhhhh~~~~";
      }
    }
    interface example3{
      public function teacher();
    }
    class child extends Person implements example,example3{
      function student(){
        echo "hello,student.<br>";
      }
      function teacher(){
        echo "hello,teacher.<br>";
      }
    }
    $zhangsan = new child();
    $zhangsan->student();
    $zhangsan->teacher();
?>

文件上传

#upload.hmtl
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>文件上传</title>
</head>
<body>
<form enctype="multipart/form-data" action="index.php" method="post">
    <input type="file" name="my_uploadfile">
    <input type="submit" value="upload">
</form>
</body>
</html>
#index.php
<?php
    var_dump($_FILES);
?>