• 周一干不干活-PHP+MySQLi


    hi

    本来是雄心壮志的要干活的,哪知天有不测,早上大阴天起不来,中午又回寝室折腾衣服(做女工啊,牛不牛)没睡午觉,这样的迷糊状态,怎么科研,写这个好了。

    1、PHP的OOP编程

    4.7 多态

    --定义

    由于接口的方法实现有多种多样,这种特性称之为多态

    --栗子

    function eat($obj){
    if($obj instanceof ICanEat){
    $obj->eat("FOOD"); // 不需要知道到底是Human还是Animal,直接吃就行了
    }else{
    echo "Can't eat! ";
    }
    }

    $man = new Human();
    $monkey = new Animal();

    // 同样的代码,传入接口的不同实现类的时候,表现不同。这就是为什么成为多态的原因。
    eat($man);
    eat($monkey);

    --小结

    /**
    * 多态
    * 1. 只要某个对象实现了接口(instanceof),就可以直接在对象上调用接口的方法
    */

    4.8 抽象类

    --问题

    连接接口的类,某些方法都是相同的,那么是否能够允许类中不实现,而是在接口中实现。

    比如,人和动物吃东西不同,但呼吸相同。

    --栗子

    abstract class ACanEat{ //关键字改变
    abstract public function eat($food);//需要类自行实现的,前面加上abstract关键字

    public function breath(){
    echo "Breath use the air.<br/>";
    }

    }

    class Human extends ACanEat{ //实现接口用implenments,这里用extends
    public function eat($food){
    echo "Human eating ".$food."<br/>";
    }
    }

    class Animal extends ACanEat{ //实现接口用implenments,这里用extends
    public function eat($food){
    echo "Animal eating ".$food."<br/>";
    }
    }

    $xiaoming=new Human();
    $xiaohei=new Animal();

    $xiaoming->breath();$xiaoming->eat("food");
    $xiaohei->breath();$xiaohei->eat("shit");

    --小结

    /**
    * 抽象类
    * 1. 抽象类允许类里面的部分方法暂时没有具体实现,这些方法我们成为抽象方法
    * 2. 一旦类里面有抽象方法,这个类就必须是抽象类
    * 3. 抽象类跟接口一样,不能直接实例化为对象
    */

    五、魔术方法

    5.1 简介

    注意所有的魔术方法前面都是两个下划线__

    PHP中的OOP特有的。

    比如构造函数和析构函数。

    5.2 __tostring()和__invoke()

    --定义

    __tostring(),当对象被当作String使用时,这个方法会被自动调用;echo $obj;

    __invoke(),当对象被当作方法(函数)调用时,这个方法被自动调用;$obj(4);

    --栗子

    <?php
    /*
    * tostring()魔术方法
    * invoke()魔术方法
    */

    class MagicTest{
    public function __toString(){
    return "This is the class magictest.";
    }
    public function __invoke($x){
    echo "<br/>".$x;
    }
    }
    $obj=new MagicTest();
    echo $obj;

    $obj(5);

    用法和构造函数析构函数类似。比较自动化(自动调用,即使没有声明也会调用),但同时比较容易出错,小心。

    5.3 __call()和__callStatic()或重载(overloading)

    --定义

    当对象访问不存在的方法名称时,__call()会被自动调用;

    当对象访问不存在的静态方法名称时,__callStatic()会被自动调用;

    这两个方法,又称为重载(不同于重写);通过这两个方法,同一个方法的名称的调用可以对应不同的方法实现

    --栗子

    <?php
    /*
    * tostring()魔术方法
    * invoke()魔术方法
    */

    class MagicTest{
    public function __toString(){
    return "This is the class magictest.";
    }
    public function __invoke($x){
    echo "<br/>".$x."<br/>";
    }
    public function __call($name,$arguments){ //__call的格式是固定的,第一个是方法名,第二个是方法内的参数
    echo "Calling ".$name." with parameters: ".implode(",", $arguments)."<br/>";
    }
    public static function __callstatic($name,$arguments){ 
    echo "Static calling ".$name." with parameters: ".implode(",", $arguments)."<br/>";
    }
    }
    $obj=new MagicTest();
    echo $obj;

    $obj(5);

    $obj->runTest("para1","para2");
    $obj::runTest("para3","para4");

    注意这里要求定义方法的时候格式是固定的。

    5.4 __get()__set()__isset()__unset

    --定义

    这几个方法也被称为属性重载的魔术方法。

    __set(),在给不可访问属性(一种是属性未定义,另一种是没有访问权限,如private)赋值时调用;

    __get(),读取不可访问属性的值时调用;

    __isset(),当对不可访问属性调用isset()或empty()时调用;

    __unset(),。。。。。。。。。unset()。。。。。。。。。。

    --栗子

    <?php
    /*
    * tostring()魔术方法
    * invoke()魔术方法
    */

    class MagicTest{
    public function __toString(){
    return "This is the class magictest.";
    }
    public function __invoke($x){
    echo "<br/>".$x."<br/>";
    }
    public function __call($name,$arguments){ //__call的格式是固定的,第一个是方法名,第二个是方法内的参数
    echo "Calling ".$name." with parameters: ".implode(",", $arguments)."<br/>";
    }
    public static function __callstatic($name,$arguments){
    echo "Static calling ".$name." with parameters: ".implode(",", $arguments)."<br/>";
    }
    public function __get($name){ //get要有name
    return "Getting the property ".$name."<br/>";
    }
    public function __set($name,$value){ //set要有名有值
    echo "Setting the property ".$name." to value ".$value.".<br/>";
    }
    public function __isset($name){ //判断是否定义了属性
    echo "__isset invoked<br/>";
    return true;
    }
    public function __unset($name){ //撤销
    echo "unsetting protery ".$name."<br/>";
    return true;
    }
    }
    $obj=new MagicTest();
    echo $obj;

    $obj(5);

    $obj->runTest("para1","para2");
    $obj::runTest("para3","para4");

    echo $obj->classname;
    $obj->classname="shit";

    echo isset($obj->classname)."<br/>";
    unset($obj->classname);echo "<br/>";
    echo empty($obj->classname)."<br/>";

    结果是

    This is the class magictest.
    5
    Calling runTest with parameters: para1,para2
    Static calling runTest with parameters: para3,para4
    Getting the property classname
    Setting the property classname to value shit.
    __isset invoked
    1
    unsetting protery classname

    __isset invoked

    可以看到,其实isset和empty调用__isset时一对相反的操作。

    然后,__set($name,$value)和__unset($name)是一对相反的操作,但所要元素不一样;

    __isset($name),__get($name)都只需要名字(记住每个魔术方法的作用,理解了,就好记了)。

    5.5 __clone()

    --定义

    就是克隆,或克隆

    --栗子

    先给出clone关键字的用法。

    <?php
    /*
    * 克隆魔术方法
    */

    class nbaPlayer{
    public $name;
    }

    $james=new nbaPlayer();
    $james->name='James';
    echo $james->name."<br/>";

    $kobe=clone $james;
    $kobe->name='Kobe';
    echo $kobe->name;

    clone后的,就是个单独的对象,对其操作不影响原对象。

    加上__clone()

    <?php
    /*
    * 克隆魔术方法
    */

    class nbaPlayer{
    public $name;

    public function __clone(){
    $this->name="shit";
    }

    }

    $james=new nbaPlayer();
    $james->name='James';
    echo $james->name."<br/>";

    $kobe=clone $james;
    echo $kobe->name."<br/>";
    $kobe->name='Kobe';
    echo $kobe->name."<br/>";

    一般来说,用处在于clone后的初始化;或者说,当复制后,不想透露的某些信息的掩盖。

    在工作中常用到这一个,因为常有对某个对象的操作,又不想影响原有数据,就克隆/复制一个出来。

    ----------------------------------------

    2、MySQLi扩展

    一、安装及下载

    1.1 优势及简介

    更新更好,PHP5及以后推荐使用(或者PDO)。

    --优点

    基于OOP和面向过程的使用;

    支持预处理语句;

    支持事务。

    --其他

    速度更快。安全性更好

    1.2 安装及配置

    --安装

    配置php,开启php_mysqli.dll;

    配置extension_dir='ext目录位置';

    重启服务器。

    (我用的是WAMP,直接打对勾就行)

    --验证

    <?php
    /*
    * 验证mysqli是否开启
    */

    //phpinfo();
    //2.检测扩展是否已经加载
    var_dump(extension_loaded('mysqli'));
    var_dump(extension_loaded('curl'));
    echo '<hr/>';
    //3.检测函数是否存在
    var_dump(function_exists('mysqli_connect'));
    echo '<hr/>';
    //4.得到当前已经开启的扩展
    print_r(get_loaded_extensions());
    echo '<hr/>';

    ---

    困了,回去洗洗睡觉。。。

  • 相关阅读:
    从头来之【图解针对虚拟机iOS开发环境搭建】 (转)
    换工作?请记得8、18、48与72这四个密码(转)
    php
    linux上svn连接visual svn server时ssl鉴权失败,问题解决(转)
    javamail发送邮件的简单实例(转)
    稀疏矩阵
    Redis11种Web应用场景
    说说ShellExecuteEx
    怎样从host之外连接到docker container
    hadoop日志分析
  • 原文地址:https://www.cnblogs.com/andy1202go/p/5026412.html
Copyright © 2020-2023  润新知