1

面向对象

  • 万事万物皆对象

面向对象(英语:Object-oriented programming,缩写:OOP)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术[1] 发展到一定阶段后的产物。

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

php 类

创建一个简单的类


<?php
    
    class MyClass{
        
    }

?>   

实例化对象类


<?php 

    class MyClass(){
        
    }
    
    $myclass = new MyClass();

?>

类的控制访问

  • public(公有):公有的类成员可以在任何地方被访问。
  • protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
  • private(私有):私有的类成员则只能被其定义所在的类访问。

类的属性与方法

属性-> 就是类里边的变量

方法-> 类里边的方法


<?php 

    class MyClass(){
    
        public $public = 'Public';
        protected $protected = 'Protected';
        private $private = 'Private';
        
        public function aa(){
            echo "你好在做什么";
        }
        
    }
    
    $myclass = new MyClass();

    $myclass->aa();

?>

类的常量

  • const 关键字

class MyClass
{
    const constant = '常量值';

    function show() {
        echo  self::constant;
    }
}

echo MyClass::constant ;

类的构造方法和析构方法

<?php 

    class MyClass(){
        
        function __construct() {
           echo "构造方法";
        }
        
        function __destruct() {
           echo "析构方法";
        }
        
    }
    
    $myclass = new MyClass();

?>

类的继承以及final

  • extends 关键字

<?php

class BaseClass {

   function aa() {
       echo "BaseClass 类中方法";
   }
   
   
   
}
class SubClass extends BaseClass {
   
}

$sub = new SubClass();

$sub->aa();

?>
  • final 关键字

<?php

final class BaseClass {

   function aa() {
       echo "BaseClass 类中方法";
   }
   
   
   
}
class SubClass extends BaseClass {
   
}

$sub = new SubClass();

$sub->aa();

?>

调用父类构造方法

  • parent 关键字

<?php

class BaseClass {
   function __construct() {
       echo "BaseClass 类中构造方法";
   }
}
class SubClass extends BaseClass {
   function __construct() {
       parent::__construct();  // 子类构造方法不能自动调用父类的构造方法
       echo "SubClass 类中构造方法";
   }
}

?>

static关键字


<?php 

    class a{
        public static $s = "123";
    }

    echo(a::$s);

?>

命名空间

namespace 必须放在代码的第一行


<?php

namespace v;

class a{
    
}

function aa(){
    
}

var_dump(new v\a())//调用

?>
  • 以下类型会受到命名空间的影响

类(包括抽象类,traits),接口,函数,常量

  • 简单调用命名空间的类

use v\a;

var_dump(new a());
  • 重命名

use v\a as a2;

var_dump(new a2());

导入函数

<?php

use function v\aa;

aa();

?>

导入函数

<?php

use const v\aa;

echo aa;

?>

类的自动加载

__autoload()函数 php内置的


<?php

    function  __autoload($className){
        
        require $className.".php";
        
    }
    
    $im = new im();
    
    spl_autoload_register( function ($className){
        require $className.".php";
    });

?>

后期的静态绑定

魔术变量


class Test{
    
    private $abc = '';
    
    public function setAbc( $val ){
        
        $this->abc = $val;
        
    }
    
    public function getAbc( $val ){
        
        $this->abc;
        
    }
    
}

$test = new Test();

$test->setAbc("abc");
var_dump($test->getAbc());
  • __set
  • __get

class Test{
    
    private $abc = '';
    
    public function __set( $name,$val ){
        
        $this->$name = $val;
        
    }
    
    public function __get( $name ){
        
        $this->$name;
        
    }
    
}

$test = new Test();

$test->abc = '1234567';
var_dump($test->abc)
  • isset

class Test{
    
    private $abc = 'abc';
    
    public function __isset($val){
        return isset($test->$val) ? true : false; 
    }
    
    
}

$test = new Test();

var_dump(isset($test->abc));
  • __unset

class Test{
    
    private $abc = 'abc';
    
    public function __unset($val){
       
       echo("__unset:" . $val);
       unset($this->$val);
       
    }
    
    
}

$test = new Test();

unset($test->abc);
  • __call

class Test{
    
    public function __call($func,$cs){
        
        echo($func);//方法名
        print_r($cs);//传入的参数
        
    }
    
    
}

$test = new Test();

$test->go(1,ok);
  • __callStatic

class Test{
    
    public static function __callStatic($func,$cs){
        
        echo($func);//方法名
        print_r($cs);//传入的参数
        
    }
    
    
}

Test::go();
  • __invoke 当对象被当作函数调用时执行的

class Test{
    
    public function __invoke($func){
        
        var_dump($func);
        
    }
    
    
}

$test = new Test();

$test("asadasd");
  • __toString 当你打印对象的时候执行

class Test{
    
    public function __toString(){
        
        return "hello....";
        
    }
    
    
}

$test = new Test();

echo($test);

对象拷贝和类型约束

  • 浅拷贝

    class A{
        
        public $age = 10;
        public $name = "";
        
        public $name = null;
        
    }

    $a = new A();
    
    $b = $a;
    
    $b->age = 1;
    
    var_dump($a->age);
  • 深拷贝

    class A{
        
        public $age = 10;
        public $name = "";
        
        public $name = null;
        
    }

    $a = new A();
    
    $b = clone $a;
    
    $b->age = 1;
    
    var_dump($a->age);
  • 类型约束

    class A{
    
        public $name = "";
        
        public function go(){
            echo "12345678900987654321";
        }
        
    }

   function text(A $a){
       $a->go();
   }
    text(new A());

Trait关键字

php单继承 只能继承一个类


trait Bt{
    
    public function a(){
        echo "aaa";
    }
    
    public function b(){
        echo "bbb";
    }
    
    public function c(){
        $this->a();
        $this->b();
    }
    
}

class Text{
    
    use Bt;
    
}

$test = new Test();
$test->c();

接口类和抽象类以及设计模式


哈希
744 声望8 粉丝