Blogger Information
Blog 39
fans 0
comment 0
visits 34007
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
类与对象重载和链式数据库--2019/08/01
LISTEN的博客
Original
583 people have browsed it

1、// 类成员的访问控制
// 1. public: 默认的, 任何地方可以访问, 类内, 类外, 子类中
// 3. protected: 受保护的, 对外是封闭的不可访问, 但是类的内部和子类可以访问
// 3. private: 私有的, ***于本类中的访问

实例

<?php
namespace _0801test;

// 类成员的访问控制
// 1. public: 默认的, 任何地方可以访问, 类内, 类外, 子类中
// 3. protected: 受保护的, 对外是封闭的不可访问, 但是类的内部和子类可以访问
// 3. private: 私有的, ***于本类中的访问

class Demo
{
    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->salary;
    }

    // 工资设置器方法
    public function setSalary($value)
    {
        $this->salary=$value;
    }

}

// 客户端
//$obj=new Demo('admin','php程序员','6000','开发部');
$obj=new Demo('jack','HR','5000','人事部');
echo $obj->name."<br>";

//echo $obj->position;//报错,受保护的, 对外是封闭的不可访问, 但是类的内部和子类可以访问
echo $obj->getPosition().'<br>';

//echo $obj->salary;//报错,私有的, ***于本类中的访问,外部和子类不能访问
echo $obj->getSalary().'<br>';

$obj->setSalary(6666);
echo $obj->getSalary().'<br>';

echo '<hr>';

class Sub extends Demo
{
    public function salary(){
        echo '工资:';
//        return $this->salary; ///报错,私有的, ***于本类中的访问,外部和子类不能访问
    }

    public function position()
    {
        return $this->position;
    }
}

$sub=new Sub('tom','java工程师',8888,'开发部');
echo $sub->salary().'<br>';
echo '<hr>';
echo $sub->getSalary().'<br>';
echo $sub->position().'<br>';
echo $sub->getPosition();

运行实例 »

点击 "运行实例" 按钮查看在线实例


2、// 静态属性和静态方法 又叫 类属性和类方法。  普通的属性和方法 又叫 实例属性和实例方法

实例

<?php
namespace _0801test;

// 静态属性和静态方法 又叫 类属性和类方法。  普通的属性和方法 又叫 实例属性和实例方法

class Demo1
{
    public $name;

    //静态属性;static
    public static $age;

    public function __construct($name,$age)
    {
        $this->name=$name;

        // 在类中访问静态的成员
        self::$age=$age;
    }

    // 实例方法
    public function getInfo1()
    {
        return $this->name.' 年龄是: '.self::$age;
    }

    // 静态方法
    public static function getInfo2()
    {
        echo 'aa'.'<br>';
//        return $this->name.' 年龄是: '.self::$age;//报错,静态方法里面不能访问$this,即不能有实例
    }

    // 静态方法1
    public static function getInfo3($name){
        return $name.' 年龄(静态getInfo3)是:'.self::$age;
    }

}

$obj=new Demo1('admin',22);

// 实例属性
echo $obj->name.'<br>';

// 静态属性, 类的外部直接用类名访问, 双冒号: 范围解析符
echo Demo1::$age.'<br>';// 静态属性1
echo $obj::$age.'<br>';// 静态属性2

echo '<hr>';

// 实例方法
echo $obj->getInfo1().'<br>';

//静态方法
echo $obj->getInfo2();

$name=$obj->name;
echo $obj->getInfo3($name).'<br>'; ////静态方法1
echo Demo1::getInfo3($name); ////静态方法2

echo '<hr>';
echo '<hr>';
$obj1=new Demo1('admin1',11);
echo Demo1::$age.'<br>';// 静态属性1
echo $obj1::$age.'<br>';// 静态属性2
$name=$obj1->name;
echo $obj1->getInfo3($name).'<br>'; ////静态方法1
echo Demo1::getInfo3($name); ////静态方法2

运行实例 »

点击 "运行实例" 按钮查看在线实例


3、// 类常量 只能用const定义,不能用define

实例

<?php
namespace _0801test;

class Demo2
{
    // 类常量 只能用const定义,不能用define
    const NATION='中国';

    // 类量与类属性不一样,类属性就是静态属性
    public static $sex='男';
    private $name;

    public function __construct($name)
    {
        $this->name=$name;
    }

    // 实例方法
    public function getInfo()
    {
        return $this->name.'的性别是:'.self::$sex.', 国籍是:'.self::NATION;
    }

}

$obj=new Demo2('admin');

// 访问类属性: 静态属性
echo Demo2::$sex.'<br>';

// 访问类常量,与访问静态属性一致
echo Demo2::NATION.'<br>';

Demo2::$sex='女'; //静态属性值可以修改
echo Demo2::$sex.'<br>';

//Demo2::NATION='China'; //报错,类常量不能修改
echo Demo2::NATION.'<br>';

echo $obj->getInfo();

运行实例 »

点击 "运行实例" 按钮查看在线实例


4、// 属性重载 当访问一个不存在的或者私有属性(权限不够)或方法的时候,能够触发的一些列的魔术方法
// __get($name), __set($name, $value), __isset($name), __unset($name)

实例

<?php
namespace _0801test;

// 属性重载 当访问一个不存在的或者私有属性(权限不够)或方法的时候,能够触发的一些列的魔术方法
// __get($name), __set($name, $value), __isset($name), __unset($name)

class Demo3
{
    private $name;
    private $salary;
    protected $age;
    protected $position='人事主管';

    public function __construct($name,$salary,$age)
    {
        $this->name=$name;
        $this->salary=$salary;
        $this->age=$age;
    }

    // 属性重载方法: __get()  获取属性值
    public function __get($name)
    {
        if ($name==='age'){
            return ($this->name==='admin')?'无权查看':$this->$name;
        }
        return $this->$name;
    }

    // 属性重载方法: __set()  设置属性值
    public function __set($name, $value)
    {
        if($name==='position'){
            ($this->name==='admin')?'无权修改':$this->$name=$value;
        }else{
           $this->$name=$value;
       }
    }

//    public function test()
//    {
//        // get_class_vars(): 返回类中属性组成的数组 放类的外部只能访问public属性,放类的内部就能访问private 和 protected
//        $properties=get_class_vars(self::class);
//        echo '<pre>'.print_r($properties,true);
//    }


//    // 属性重载方法: __isset()  判断属性是否定义
    public function __isset($name)
    {
//        if ($this->$name==true){
//            echo $this->$name.'<br>';
//        }else{
//            echo '没有该属性<br>';
//        }

        if(isset($this->$name)){
            echo '存在该属性<br>';
        } else {
            echo '没有这个属性<br>';
        }
    }

    // 属性重载方法: __unset()销毁属性
    public function __unset($name)
    {
        if($this->name==='admin'){
            unset($this->$name);
        }else{
            echo '无权删除<br>';
        }

    }

}

$obj=new Demo3('admin',8888,28);
$obj1=new Demo3('admin111',6666,23);

echo $obj->name.'<br>';
echo $obj->salary.'<br>';
echo $obj->age.'<br>';
echo $obj->position.'<br>';
//echo $obj->abc.'<br>';//报错,没有该属性

echo '<hr>';

echo $obj1->name.'<br>';
echo $obj1->salary.'<br>';
echo $obj1->age.'<br>';
echo $obj1->position.'<br>';

echo '<hr>';

$obj->salary=9999;
echo $obj->salary.'<br>';
$obj->position='总经理';
echo $obj->position.'<br>';

$obj1->salary=7777;
echo $obj1->salary.'<br>';
$obj1->position='开发工程师';
echo $obj1->position.'<br>';

echo '<hr>';
echo '通过__set()和__get()新增属性和获取属性值<br>';
$obj->abc='abc';
echo $obj->abc.'<br>';

echo '<hr>';
//$obj->test();

// 检测某一个属性是否存在
isset($obj->name);
//isset($obj->salary);
//isset($obj->age);
//isset($obj->position);
isset($obj->abc);
isset($obj->abc1);

echo '<hr>';

unset($obj->age);
isset($obj->age);
unset($obj1->age);
isset($obj1->age);
echo '<hr>';
//unset($obj->abc);
//echo $obj->abc;
//unset($obj->abc1);
//echo $obj->abc1;

运行实例 »

点击 "运行实例" 按钮查看在线实例


5、// 方法重载: __call(), __callStatic()

实例

<?php
namespace _0801test;

// 方法重载: __call(), __callStatic()

function sum($a,$b)
{
    return $a+$b.'<br>';
}
echo __NAMESPACE__.'<br>';
echo call_user_func_array(__NAMESPACE__.'\sum',[10,20]);

echo '<hr>';

class Test1
{
    public function sum1($a,$b)
    {
        return $a+$b.'<br>';
    }
}

$test1=new Test1();
echo call_user_func_array([$test1,'sum1'],[1,2]);
echo call_user_func_array([new Test1(),'sum1'],[2,3]);

echo '<hr>';
class Test2
{
    public static function sum2($a,$b)
    {
        return $a+$b.'<br>';
    }
}
//将对象/类中的方法以回调的方式来执行
echo Test2::sum2(7,8);
echo call_user_func_array([__NAMESPACE__.'\Test2','sum2'],[8,8]);
echo call_user_func_array(__NAMESPACE__.'\Test2::sum2',[8,9]);

// 完整的类名 = 命名空间 + 类名,   类名::class
echo Test2::class.'<br>';
echo call_user_func_array([Test2::class,'sum2'],[9,9]);


echo '<hr>';

echo '<h3>方法重载 </h3>';

class Demo4
{
    // 重载普通方法
    // $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 Demo4();

// 访问一个不存在的方法
echo $obj->getInfo1(1,'hh',6,[11,22]);

// 访问一个不存在 的静态方法
echo Demo4::getInfo2('aaa','bbb');

运行实例 »

点击 "运行实例" 按钮查看在线实例


6、链式的数据库

实例

<?php
namespace _0801test;

require 'Query.php';
use _0801test\Query;

class Db
{
    // 数据库的连接对象
    protected static $pdo=null;

    // 连接方法
    public static function connection()
    {
        self::$pdo=new \PDO('mysql:host=localhost;dbname=listen0724','root','root');
    }

    public static function __callStatic($name, $arguments)
    {
        // 连接数据库
        self::connection();

        // 实例 化一个查询类Query.php, table(), filed(), select()这些链式方法的提供者
        $query=new Query(self::$pdo);

        // 执行查询类中的方法
        return call_user_func_array([$query,$name],$arguments);
    }
}

//查询所有数据
$db1=Db::table('nav')->select();
foreach ($db1 as $db){
    print_r($db);
    echo '<br>';
}

echo '<hr>';

//查询指定数据
$db2=Db::table('nav')
    ->field('nav_id,alias')
    ->where('nav_id>1')
    ->limit('0,2')
    ->select();

foreach ($db2 as $db){
    print_r($db);
    echo '<br>';
}

echo '<hr>';

//插入数据
//$db3=Db::table('nav')
//    ->data("`name`='download',`alias`='下载中心',`image`='nav.jpg'")
//    ->add();
//
//echo $db3;

echo '<hr>';

//修改数据
//$db4=Db::table('nav')
//    ->data("`image`='image1.jpg'")
//    ->where('nav_id=10')
//    ->update();
//echo $db4;

//echo '<hr>';

//删除数据
//$db5=Db::table('nav')
//    ->where('nav_id=10')
//    ->delete();
//echo $db5;

运行实例 »

点击 "运行实例" 按钮查看在线实例

Query.php代码:

实例

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/8/2
 * Time: 19:29
 */

namespace _0801test;


class Query
{
    public $pdo=null;
    public $table;
    public $field='*';
    public $where;
    public $limit;
    public $data='';

    public function __construct($pdo)
    {
        $this->pdo=$pdo;
    }

    // 设置表名
    public function table($tableName)
    {
        $this->table=$tableName;
        // 关键步骤: 返回一个当前类的实例
        return $this;
    }

    // 设置数据
    public function data($data='')
    {
        $this->data=empty($data)?'':$data;
        return $this;
    }

    // 设置字段
    public function field($fields='*')
    {
        $this->field=empty($fields)?'*':$fields;
        return $this;
    }

    // 设置查询条件
    public function where($where='')
    {
        $this->where=empty($where)?$where:' where '.$where;
        return $this;
    }

    // 设置数量
    public function limit($limit)
    {
        $this->limit=empty($limit)?$limit:' limit '.$limit;
        return $this;
    }

    // 查询语句
    public function select()
    {
        // 拼装SQL语句
        $sql='select '
            .$this->field
            .' from '
            .$this->table
            .$this->where
            .$this->limit;

        // 预处理查询
        $stmt=$this->pdo->prepare($sql);
        $stmt->execute();
//                die($stmt->debugDumpParams()); //数据库调试语言
        return $stmt->fetchAll(\PDO::FETCH_ASSOC);
    }

    //插入语句
    public function add()
    {
        $sql='insert into '
            .$this->table
            .' set '
            .$this->data;

        $stmt = $this->pdo->prepare($sql);
        $stmt->execute();
        return  $this->pdo->lastInsertId();
    }

    //修改语句
    public function update()
    {
        if($this->where==''){
            return 0;
        }
        $sql='update '
            .$this->table
            .' set '
            .$this->data
            .$this->where;

        $stmt = $this->pdo->prepare($sql);
        $stmt->execute();
        return $stmt->rowCount();
    }

    //删除语句
    public function delete()
    {
        if($this->where==''){
            return 0;
        }
        $sql='delete from '
            .$this->table
            .$this->where;

        $stmt = $this->pdo->prepare($sql);
        $stmt->execute();
        return $stmt->rowCount();
    }
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

链式的数据库 查询 和 插入 功能运行结果:

1.png

Correction status:qualified

Teacher's comments:属性重载的意义 ,远没有方法重载的大, 在实际开发, 很多高级应用技术 ,都依赖方法重载 实现的
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post