华夏棋牌明天,我们学习了静态成员与措施重载,详细内容由工具成员的会见限制,静态属性 措施的界说与会见,类常量与静态属性的差异与类似,静态属性措施的重载,还做了案例:仿Thinkphp的连式挪用。

华夏棋牌一、工具成员的会见限制

华夏棋牌会见限制符划定了工具属性、措施的作用域,public在类内类外子类都可用,protected在类内 子类可用 ,private在类内可用,但是要在类外会见protected private的属性怎样办,通常是先用结构函数把各个属性初始化,然后在经由历程public的前往,外部便可以挪用了。

实例

<?php
class Demo06
{
    public $name;           //姓名
    protected $position;    //职位
    private $salary;        //人为
    protected $department;  //部门
    //结构函数
    public function __construct($name, $position, $salary, $department)
    {
        $this->name = $name;
        $this->position = $position;
        $this->salary = $salary;
        $this->department = $department;
    }
//    取得职位的措施
    public function getPosition(){
        return $this->department === '培训部' ? $this->position : '无权检查';
    }
//    取得人为的措施
    public function getSalary(){
        return $this->department ==='财政部' ? $this->salary : '无权检查';
    }
    public function setSalary($salary){
        return $this->department ==='财政部' ? $this->salary = $salary : '无权更新';
    }
}

$obj = new Demo06('明仔', '法式模范模范员', 9999, '培训部');
//$obj = new Demo06('明仔', '法式模范模范员', 9999, '财政部');
echo $obj->name.'<br>';
//echo $obj->position.'<br>';
//echo $obj->salary.'<br>';
echo $obj->getPosition().'<br>';
echo $obj->getSalary().'<br>';
$obj->setSalary(1111);
echo $obj->getSalary().'<hr>';
/**************************************/
class sub extends Demo06
{

}
$obj = new sub('豆豆', '职员', 8888, '财政部');
echo $obj->getSalary().'<br>';
echo $obj->getPosition();

运转实例 »

华夏棋牌点击 "运转实例" 按钮检查在线实例

2、静态成员的界说与会见

类浅易作为实例化工具的模版,然则存在以下的情形,可以不实例化成工具,直接用类来会见属性 措施,这就是静态属性、静态措施,统称为静态成员。

华夏棋牌情形一、有时一个类只实例化成一个工具,那么为何不用类直接会见属性和措施?

华夏棋牌情形二、有时统一个类实例化的许多工具,都有合营的属性须要挪用,这样为何不给类一个统一属性,让他们合营挪用,而不是实例化一次挪用一次

详细会见是是不须要实例化  直接类::属性名  或许类::措施()

华夏棋牌ps实例化的工具不克不及会见静态属性 但是可以会见静态的措施

实例

<?php
//类浅易作为实例化工具的模版,会见类中的属性 措施都是先实例化成工具然后挪用,然则可弗成以经由历程类直接会见?
//静态属性 静态措施可以不实例化会见,静态成员的引入可以处置赏罚赏罚两个效果
//1就是有的时间只须要一个工具  那么实例化和直接用类是一样的
//2有的时间实例化成许多的工具,假定须要共享的属性,还的一个个赋值给属性  费事

class Demo01
{
    public $product;
    public static $price;
//    结构函数温馨化
    public function __construct($product, $price)
    {
        $this->product = $product;
        self::$price = $price;
    }
//    工具措施
    public function getInfo1(){
        return $this->product.'价钱是:  '.self::$price;
    }
//    静态措施
    public static function getInfo2($product){
        return $product."价钱是:   ".self::$price;
    }
}
$obj = new Demo01('***', 5433);
echo $obj->product.'<br>';
echo Demo01::$price.'<br>';
echo $obj->getInfo1().'<br>';
echo Demo01::getInfo2($obj->product).'<br>';
//工具不克不及会见静态属性  然则可以会见静态措施
echo $obj->getInfo2($obj->product);

运转实例 »

华夏棋牌点击 "运转实例" 按钮检查在线实例

3、类常量的定于与会见

华夏棋牌类常量与静态属性根天职歧,不合的是类常量的值禁绝可改变,静态属性可以被修改

实例

<?php
//类常量
class Demo02
{
    //类常量同类属性一样,不须要实例化挪用,而是直接由类挪用
    //差异是类常量不克不及改变,类属性可以改变
    const NATION = '中国';
    public static $sex = '男';
    private $name;
    public function __construct($name)
    {
        $this->name = $name;
    }
    public function getInfo()
    {
        //类常量和类属性一样在类内挪用的话用self
        return $this->name.'性别是: '.self::$sex.',国籍是:'.self::NATION.'<br>';
    }
}
$obj = new Demo02('明仔');
echo $obj->getInfo();
//修改类属性
Demo02::$sex = '保密';
//修改类常量掉落足
//Demo02::NATION = 'riben';
echo $obj->getInfo();

运转实例 »

点击 "运转实例" 按钮检查在线实例

四、属性重载

华夏棋牌但在类外会见protected  private属性是统称被限制,针对上述情形,由魔术措施来处置赏罚赏罚效果。

__get($name)  泛起不克不及会见的情形,就自动挪用此措施,然后将属性名作为参数穿出来,然后该措施在阻拦处置赏罚赏罚

__set($name, $value) 这措施是设置器

__isset($name) 这是断定能否由该属性

华夏棋牌__unset($name)是销毁属性

实例

<?php
//属性重载
class Demo11
{
    //设置私有属性
    private $name;
    private $salary;
    protected $secret = '我有一个小神秘';
    public function __construct($name, $salary)
    {
        $this->name = $name;
        $this->salary = $salary;
    }
    //用__get 泛起不克不及显示的类属性自动挪用该措施作为取得器
    public function __get($name)
    {
        //对用户阻拦断定 假定要检查secret 那么必须是admin的用户才干检查 否则无权检查
        //  其他的类属性便可以直接检查
        if ($name === 'secret') {
            return $this->name === 'admin' ? $this->$name : '无权检查';
        }
        return $this->$name;
    }
    //__set 泛起不克不及显示的类属性后 对该属性阻拦设置

    public function __set($name, $value)
    {
        // 直接前往, 少少这样做
//        $this->$name = $value;

        // 添加过滤机制
        if ($name === 'salary') {
            return $this->name === 'admin' ? $this->$name = $value : '无权修改';
        }
        return $this->$name = $value;
    }

    public function __isset($name)
    {
        if ($this->name === 'admin') {
            if (isset($this->$name)) {
                echo '属性存在';
            } else{
                echo '属性不存在';
            }
        } else{
            echo '无权检测';
        }
    }

    public function __unset($name)
    {
        if ($this->name === 'admin') {
            unset($this->$name);
        } else {
                echo '无权删除';
        }
    }

}

$obj = new Demo11('明仔', 1111);

echo $obj->name.'<br>';
$obj = new Demo11('admin', 9999);
echo $obj->secret.'<br>';
$obj->salary = 8888;
echo $obj->salary;
echo "<hr>";
isset($obj->salary);
echo '<br>';
unset($obj->salary);
isset($obj->salary);

运转实例 »

点击 "运转实例" 按钮检查在线实例

五、措施重载

针对在类外不克不及会见的措施由__call  明天措施__callStatic()

华夏棋牌尚有两个措施  call_user_func()  call_user_func_array()  他们将函数名作为参数,函数里的参数作为参数的两个措施,后者是吧参数用数组的形式穿出来

实例

<?php
//措施重载
class Demo12
{
    //泛起没有的类措施是自动挪用__call  $name是措施名,$arguments 是所有参数
    public function __call($name, $arguments)
    {
        return '措施名是  '. $name . '<br> 参数列表是' .'<pre>'.print_r($arguments, true);
    }
    //也适用于静态措施
    public static function __callStatic($name, $arguments)
    {
        return '措施名是  '. $name . '<br> 参数列表是' .'<pre>'.print_r($arguments, true);
    }

}
$obj = new Demo12();
echo $obj->getInfo('jj', 'kk', 123);
echo '<hr>';
echo Demo12::getInfo11(10, 20, 30);
echo '<hr>';

//  做个案例
//先明确两个函数
//call_user_func()  就是将一个函数作为参数  这个函数的参数做为他的参数 阻拦回调推行
//call_user_func_array()  和下面根天职歧  只不外第二个参数是回调函数的参数组成的数组
function sum ($a, $b) {
    return $a . '+' . $b .'='.($a+$b);
}

echo sum(10, 20);
echo '<br>';
//回调的要领为
echo call_user_func('sum', 10, 20);
echo '<br>';
echo call_user_func_array('sum', [10, 20]);
echo '<br>';
//那么把措施放在函数里 也能够或许挪用
class Test1
{
     public function sum ($a, $b) {
         return $a . '+' . $b .'='.($a+$b);
     }
}
$obj = new Test1();

echo call_user_func([$obj, 'sum'], 20, 40);
echo '<br>';
echo call_user_func([new Test1(), 'sum'], 20, 40);
echo '<br>';

//类的静态措施也适用
class Test2
{
    public static function mul ($a, $b) {
        return $a . '*' . $b .'='.($a*$b);
    }
}

echo call_user_func('Test2::mul', 20, 40);
echo '<br>';
//也能够或许
echo call_user_func_array(['Test2', 'mul'], [20, 40]);
echo '<br>';
echo Test2::class;    //可以输入类的字符串
echo '<br>';
//也能够或许
echo call_user_func_array([Test2::class, 'mul'], [20, 40]);

运转实例 »

点击 "运转实例" 按钮检查在线实例

六、案例:连式挪用

实例

<?php
//模拟ThinkPhp 连式操作 查询数据库
//援用外部类
require 'Query1.php';
class Db1
{
    //数据库毗连工具初始化
    protected static $pdo = null;
    //数据库毗连措施 完成惰性毗连 每次用时在毗连  节俭资源
    public static function connection () {
        self::$pdo = new PDO('mysql:dbname=php', 'root', 'root');
    }
    //  查询类的出口  经由历程用__callStatic  措施完成跨类挪用
    public static function __callStatic($name, $arguments)
    {
        //培植pdo工具毗连数据库
        self::connection();
        //实例化查询类 将毗连工具作为参数
        $query = new Query1(self::$pdo);
        return call_user_func_array([$query, $name], [$arguments[0]]);
    }
}


$staffs = Db1::table('staff')
    ->field('id,name,position,mobile')
    ->where('id > 5')
    ->limit(5)
    ->select();
foreach ($staffs as $staff) {
    echo '<pre>'.print_r($staff, true);
}

运转实例 »

华夏棋牌点击 "运转实例" 按钮检查在线实例

Query.php

实例

<?php
//模拟ThinkPhp 连式操作 查询数据库
//援用外部类
require 'Query1.php';
class Db1
{
    //数据库毗连工具初始化
    protected static $pdo = null;
    //数据库毗连措施 完成惰性毗连 每次用时在毗连  节俭资源
    public static function connection () {
        self::$pdo = new PDO('mysql:dbname=php', 'root', 'root');
    }
    //  查询类的出口  经由历程用__callStatic  措施完成跨类挪用
    public static function __callStatic($name, $arguments)
    {
        //培植pdo工具毗连数据库
        self::connection();
        //实例化查询类 将毗连工具作为参数
        $query = new Query1(self::$pdo);
        return call_user_func_array([$query, $name], [$arguments[0]]);
    }
}


$staffs = Db1::table('staff')
    ->field('id,name,position,mobile')
    ->where('id > 5')
    ->limit(5)
    ->select();
foreach ($staffs as $staff) {
    echo '<pre>'.print_r($staff, true);
}

运转实例 »

点击 "运转实例" 按钮检查在线实例

总结

华夏棋牌1、静态成员可以不用实例化不须要工具挪用,有时较量轻盈

2、类常量是不克不及修改的

华夏棋牌3、属性重载可以不用每个会见不到的属性伶仃设置取得的措施,只须要一个取得去 凭证属性名来取得属性值

华夏棋牌4、措施 重载同属性重载的意义一样,这里须要重视call_user_func call_user_func_array  这俩个回调函数的妙用,在前面的案例中,他作为跨类会见的出口,可以现在另外的类中界说好种种措施 然后凭证情形在挪用

5、连式挪用的焦点在与每个措施最后都前往$this 工具自己,这样才干让下一个措施由工具看挪用  完成连式挪用