php魔术常量和魔术方法

1.概述

__get:获取私有属性值的时候调用

__set:设置私有属性值的时候调用

__construct:构造方法

__destruct:析构方法

__unset

    触发时机:当销毁一个私有成员属性的时候调用

    参数:属性名

__isset

    触发时机:当判断一个私有成员属性是否被设置过时调用

    参数:属性名

__invoke(了解)

    触发时机:当将一个对象当作函数使用的时候被调用

    参数:任意多个,调用时传递多少个这里就写多少个

__toString(了解)

    触发时机:当echo一个对象的时候调用

    参数:没有参数

    返回值:返回一个字符串,该字符串就会被打印出来,这个字符串需要自己定制

__debugInfo(了解)

    触发时机:当var_dump来打印这个对象的时候调用

    参数:没有参数

    返回值:返回一个自定义的数组,你想打印什么就打什么

__call

    触发时机:当调用一个不存在的成员方法的时候触发

    参数:方法名 参数数组

__callStatic(讲完静态方法时候再讲)

$this->成员属性:在类里面访问自己的成员属性和方法。

public:公共的,在类内和类外都可以直接访问

private:私有的一般在类外不能访问。


2.魔术方法:

(1)__unset():用unset销毁一个私有的成员属性的时候调用,参数:属性名。

<?php
class Cat {

	public $nmae;

	private $age;

	private $height;

	public function __construct($name, $age, $height) {

		$this->name = $name;

		$this->age = $age;

		$this->height = $height;

	}

	public function miao() {

		echo 'miaomiao';

	}

	public function __unset($arg) {

		echo $this->$arg . '被销毁了';

	}

}

$bosi = new Cat('波斯猫', 10, 20);

unset($bosi->age);

(2)__isset():当判断一个私有的成员属性是否被设置时调用,参数:属性名。

<?php

  class Cat

  {

  .......

    public function __isset($arg)

      {

        return isset($this->$arg);

      }

  }

isset($bosi->age);

(3)__invoke:当将一个对象当做函数时被调用,参数任意多个,调用时传递多少个这里就写多少个。

<?php

  class Dog

  {

    public $name = 'wang';

  public function wangwang()

    {

      echo '旺旺';

    }

  public function __invoke($a,$b,$c)

    {

      echo '将对象作为函数使用了';

    }

  }

$tai = new Dog();

$tai(100,200,300);

(4)__toString:当echo一个对象的时候调用,这个函数里面返回什么字符串echo的时候就打印出什么。没有参数,但是有返回值,返回一个字符串,该字符串需要自己定制。

<?php

  class Dog

  {

    ......

      public function __toString()

      {

      return '我的姓名是'.$this->name;

    }

  }

$tai = new Dog();

echo $tai;

(5)__debugInfo():触发时机:当使用var_dump()打印对象的时候会调用。返回一个自定义的数组,数组里面是需要打印的东西,没有参数。

<?php

  class Dog

  {

    ......

      public function __debugInfo()

      {

        return ['name','age'];

      }

  }

$tai = new Dog();

var_dump($tai);

(6)__call():调用不存在的成员方法时会自动调用该方法。参数:方法名,参数数组。

<?php

class Dog {
	//.......

	function __call($name, $args) {

		var_dump($name); //函数名

		var_dump($args);

	}

}

$tai = new Dog();

$tai->eat(100, 100);

结果:

string(3) "eat"
array(2) {
  [0] =>
  int(100)
  [1] =>
  int(100)
}

实例化一个对象后,当调用这个对象的成员方法存在时,则直接调用其成员方法,但是当成员方法不存在时,将转而去调用__call方法。

同时__call必须有两个参数,这个参数名可以随意取,但是为了方便我们通常取为$name和$args

当成员方法不存在时,__call将被调用,同时,这个不存在的方法名称会作为字符串传递给第一个参数(这里第一个参数是$name),将调用时传递的参数作为列表传递给第二个参数(这里第二个参数是$args)。
 

(7)__callStatic():调用不存在的静态方法时

3.连贯操作(链式操作):

数据库操作类查询的时候有很多条件:

$model->limit()->where()->filed()->table()->select()

<?php

  class Model

  {

    function filed()

      {

        return $this;

      }

  function limit()

    {

        return $this;

    }

     ....

    function select()

    {

      //返回查询结果。

    }

  }


4.通过__call实现单字段的查询:

<?php

  function __call($name,$args)

  {

    $str = substr($name,0,5);

    if($str == 'getBy'){

      $filed =

    }

  }

未完待续


5.继承:

(1)继承:考虑的是从相同的属性来理解,子类的特征一般多于父类。

派生:其实和继承描述的是同一个东西,但是从两个不同的方面来理解的,继承考虑的是相同的属性来考虑的,派生是从不同的属性来理解的。

父子类的叫法:父类(基类)、子类(派生类)

单继承:php是单继承的,子类只能有一个父类。

(2)继承的基本语法:

​ 在代码中子类如果继承父类,那么就拥有父类的属性和行为(某些访问控制除外)。

<?php

  class Father

  {

    public $name = '翠花';

    public $age = 18;

    public $height = 160;

  function eat()

    {

      echo '大口吃饭';

    }

  function sleep2()

    {

      echo '睡觉觉';

    }

  }

class Son extends Father

  {

    

  }

$hua  = new Son();

$hua->sleep2();


6.访问权限:

public:公共的,类外类内都可以直接访问

private:私有的,类外不可以直接访问

protected:受保护的,类外不可直接访问,类内可以

<?php

  class Girl

  {

    public $name = '刘亦菲';

    private $age = 18;//私有的不能被继承

    protected $weight = 90;//可以被继承

  function say()

    {

      echo '我叫'.$this->name;

    

    }

  }

class daughter extends Girl

  {

    function test()

      {

         echo '我叫'.$this->name;

      }

  }

$liu = new daughter();

$liu->test();


7.静态属性和静态方法

静态属性是属于整个类的,而不是属于某个对象的

静态方法的调用

​ 注意事项:(1)静态方法中不能出现$this关键字,

​ $this是属于某个对象的,但是该静态方法是属于整个类的而不是属于某个对象的。

​ (2)静态属性和方法前面可以加属性修饰符。

​ (3)使用静态属性和方法可以提高效率,通过类名就可以使用里面的属性和方法。

​ (4)可以实现单例(单一实例)

<?php

  类外调用---》类名::静态方法名();

  类内调用---》$this::方法名();


8.自动加载

规则:一个类就是一个文件,文件名要和类名相同。

__autoload:当在当前脚本中去加载一个不存在的类的时候会调用这个方法。

当加载一个类,这个类继承了其他的类,只要找不到就可以调用__autoload(),参数就是要加载的类名。

M:model 模型 和数据库打交道

V:View 视图,html文件(模板)

C:controller控制器(数据和模板之间的桥梁)

注意:这个方法是唯一的一个写在类外的方法。

<?php
class Car {

	public $name;

	public $money;

	public $speed;

	function run() {
		echo '汽车在高速上面跑';
	}

}
<?php
function __autoload($name) //$name就是类名
{
	echo '我被调用了';
	$fileName = $name . '.php';
	include $fileName;

}
//include 'Car.php';
//自动加载
$bmw = new Car();
$bmw->run();

目录结构(文件夹)结构:

model存放数据库文件

view存放界面视图文件

controller存放控制器文件

vendor:第三方的库文件

入口文件:index.php(mvc下面)
---------------------  
作者:zhongjie01  
来源:CSDN  
原文:https://blog.csdn.net/zhongjie01/article/details/69394062  
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/phoenixcsl/article/details/83382588