zoukankan      html  css  js  c++  java
  • php 父类调用子类方法和成员

    在C和C++里,父类都不允许调用子类的方法,但在php里可以。下面是一个调用的例子:

    <?php
    abstract class Animal
    {
        protected $name;
        public function run()
        {
            echo 'Aniaml run';
            $this->swim();
    echo $this->fishNum;
    } }
    class Fish extends Animal {
    public $fishNum=10;
    public function swim() { echo 'Fish swim'; } } $fish=new Fish(); $fish->swim(); $fish->run();

    输出:

    Fish swim

    Aniaml run

    Fish swim

    10

    我们在父类的run()方法里面调用了

    $this->swim();swim是子类定义的方法(注意,我们并没有在父类中定义abstract function swim()),说明了这不是多态。
    我们不仅调用了方法,还调用了成员,是ok的。

    一篇文章:
    PHP父类调用子类方法,CodeIgniter中DB的继承关系
    先看几行代码:
    class A {
        private $b;
        function __construct($a){
            $this->b = $a;
        }
        function func1(){
            var_dump($this->b);
        }
        function func2(){
            $this->funcb();
        }
    }
    
    class B extends A {
        function funcb(){
            var_dump("b");
        }
    }
    
    $a = new B('a');
    $a->func1();
    $a->func2();

    这几行代码是没有错误的,在父类中调用子类的方法,子类实例化之后可以正常工作。 CI的DB部分正是使用了这种方式来封装数据库操作。

    CI的DB函数的写法正是先加载CI_DB_driver这个基类,然后检查active record是否开启,如果开启则

    1 class CI_DB_active_record extends CI_DB_driver

    然后

    1 class CI_DB extends CI_DB_active_record

    否则

    1 class CI_DB extends CI_DB_driver

    最后在require相应数据库的driver,如mysql,

    1 CI_DB_mysql_driver extends CI_DB

    在这几个类中,只有CI_DB_driver有构造函数且带一个参数;

    DB函数中这样写的:

    1 $driver 'CI_DB_'.$params['dbdriver'].'_driver';
    2 $DB new $driver($params);

    $params正是传给CI_DB_driver的构造函数;

    然后检查是否自动初始化:如果是

    1 $DB->initialize();

    而initialize方法位于CI_DB_driver类中,此方法调用了子类的方法:

    1 $this->conn_id = ($this->pconnect == FALSE) ? $this->db_connect() : $this->db_pconnect();

    db_connect方法和db_pconnect方法是在相映数据库driver实现的。

    如mysql的实现位于CI_DB_mysql_driver类中:

      
    function db_connect()
    {
        if ($this->port != '')
        {
            $this->hostname .= ':'.$this->port;
        }
        return @mysql_connect($this->hostname, $this->username, $this->password, TRUE);
    }
     
  • 相关阅读:
    2016"百度之星"
    codeforces 55 div2 C.Title 模拟
    codeforces 98 div2 C.History 水题
    codeforces 97 div2 C.Replacement 水题
    codeforces 200 div2 C. Rational Resistance 思路题
    bzoj 2226 LCMSum 欧拉函数
    hdu 1163 九余数定理
    51nod 1225 余数的和 数学
    bzoj 2818 gcd 线性欧拉函数
    Codeforces Round #332 (Div. 2)D. Spongebob and Squares 数学
  • 原文地址:https://www.cnblogs.com/youxin/p/3251736.html
Copyright © 2011-2022 走看看