• php--第一周


      上周一周的时间主要集中在php深入对象这一块的知识上。基本的属性,访问,继承,覆盖,构造函数,命名空间,匿名函数,反射等等。

      记几个比较印象深刻的例子。

      第一个,延迟静态绑定。该意思是原本在定义阶段固定下来的表达式或变量,改在执行阶段才决定,根据当前环境输出。

     1 namespace statictest;
      class Person{ 2 public static function ownClass(){ 3 echo __CLASS__; 4 } 5 public function test(){ 6 //延迟静态绑定 7 static::ownClass(); 8 } 9 } 10 11 class son{ 12 public static function ownClass(){ 13 echo __CLASS__; 14 } 15 }

    实例化son调用test则输出son,实例化Person调用test则输出Person
    若改为self::ownClass(),则无论实例化哪个则输出Person

      上述例子,如果不使用static::ownClass(),而使用self::ownClass(),则会始终调用的是Person的class,因为在定义使用的是self,而test方法存在其Person中。而利用static则在代码执行阶段根据环境输出。

      第二个,call_user_func的使用。call_user_func经常用来调用自己定义的函数,使用场景很多。这次主要是在用法上。

      举下面几个例子:

    call_user_func('statictestPerson::ownClass');
    call_user_func(Person::ownClass);
    call_user_func([new Person(),'test']);
    call_user_func(['statictestPerson','test'])
    总结起来就是第一个参数要是方法,所以无论是用字符串还是数组的方式,要把被调用的方法表示出来。当然第一个参数如果是用数组方法表示出来的,那么数组里的第一个参数就是对象或者类名称,
    第二个就是方法名。

      第三个,利用对象的方式连接数据库--PDO。

     1 class dbo{
     2     private static $database;
     3     private $connection;
     4     function __construct($connect){
     5         if(!is_object(self::$database[$connect])){
     6             list($host,$dbname,$username,$password) = explode(',',$connect);
     7             $dsn = "mysql:host={$host};dbname={$dbname}";
     8             try{
     9                 $this->connection = new PDO($dsn,$username,$password);
    10                 self::$database[$connect] = $this->connection;
    11                 self::$database[$connect]->query('set names utf8');
    12                 self::$database[$connect]->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT);
    13             }
    14             catch(Exception $error){
    15                 $error = iconv('gbk','utf-8',$error->getMessage());
    16                 die($error);
    17             }
    18         }
    19         $this->connection = self::$database[$connect];
    20     }
    21     function getAll($sql){
    22         $args = func_get_args();
    23         array_shift($args);
    24         $statement = $this->connection->prepare($sql);
    25         $statement->execute($args);
    26         return $statement->fetchAll(PDO::FETCH_ASSOC);
    27     }
    28 }
    29 $mysqlDb = new dbo("localhost,library,jey,123654");
    30 $result = $mysqlDb->getAll('select * from categories where id > ?',3);

       第四个--克隆,clone。

      有时我们赋值对象的时候,经常是引用赋值,其中一个复制的对属性有改动后所有的对象将会变化,这与我们原本的意愿相违背。我们只是要一个复制对象,与原来的没有关系,这时我们就用到clone。

       

    现有类Person
    class Person{
        private $id;
        $name;
        $age
        function __constructor($name,$age){
            $this->name = $name;
            $this->age = $age;
        }
        function setId($id){
            $this->id = $id;
        }
        function __tostring(){
            echo 'id->'.$this->id.';$name->'.$this->name.';$this->age'.$this->age;
        }
    }
    
    $father = new Person();
    $father->setId(0897);
    $uncle = clone $father;
    这里我们直接用clone迅速得到一个快速的uncle,但是又有问题了,我们的id应该时唯一,不能直接复制。于是我们可以设置clone时的操作。并且如果Person里有一个对象属性balance,
    我们
    如果不对它作限制的话,同样也将会是引用复制。于是我们对里面的对象属性也作clone操作。

    class Person{
    ../
    function __clone(){
    $this->id = 0000;
    $this->balance = clone $this->balance;
    }
    }

       第五个,反射,ReflectionClass。用来反射出类自身。里面包含了一系列的操作,可以得到类的所有可访问信息,甚至可以实例化新对象。

    jeyfang
  • 相关阅读:
    JDBC 连接 MySQL 数据库
    通过java类的反射机制获取类的属性类型
    反射机制实例化类,并获取类中的属性、方法、和构造器
    java8u162反射机制的一个BUG
    Java反射关于getDeclaredMethods()和getMethods()的区别
    Java反射
    30天C#基础巩固------了解委托,string练习
    30天C#基础巩固------读写流(StreamWrite/StreamReader)
    30天C#基础巩固------集合,File(文件操作 ),Encoding处理字符集
    30天C#基础巩固------面向鸭子编程,关于string和File的练习
  • 原文地址:https://www.cnblogs.com/jeyfang/p/6416346.html
Copyright © 2020-2023  润新知