博客列表 >类与对象重载和链式数据库--2019/08/01

类与对象重载和链式数据库--2019/08/01

LISTEN的博客
LISTEN的博客原创
2019年08月02日 21:09:25586浏览

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

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议