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);
}
php 父类调用子类方法和成员的更多相关文章
- PHP面向对象-看父类调用子类方法
大部分面向对象编程语言中,父类是不允许调用子类的方法的,但是PHP中可以 1.父类调用子类方法示例 class A { public function testa() { $this->test ...
- java 多态 ---父类调用子类方法
package test1;//多态的体现import javax.print.attribute.standard.RequestingUserName;import java.util.Scann ...
- Java父类与子类方法调用顺序
父类 FatherClass package 父类与子类方法调用顺序; /** * 父类 * @author shundong * */ public class FatherClass { priv ...
- Java 多态 父类和子类方法的访问控制权限
Java 多态 父类和子类方法的访问控制权限 @author ixenos 父类和子类方法的访问控制权限 继承是为了扩展类的功能,而这种扩展显然就是对一个原始类的扩展,目的还是向上转型来调用,所以这就 ...
- php面向对象编程 父类调用子类编程
使用父类调用子类的实现代码
- 多态&&父类调用子类特有的方法
/* 多态 1.没有继承就没有多态 2.代码的体现:父类类型的指针指向子类对象 3.好处:如果函数\方法参数使用的是父类对象,可以传入父类.子类对象 4.局限性: 1>父类类型的变量,不能直接调 ...
- java反射与多态(父类调用子类)的代码演示
package Test0817; import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method ...
- Python父类调用子类
首先说明,上面的标题其实是不正确的,Python是一门解释型.动态数据类型的高级语言,运行时,动态判断调用对象,其实还是子类自己在调用自己的方法或属性. 举个例子(copy过来的):SocketSer ...
- 父类调用子类的常量 lumen查询数据库方式
我要在一个基类里面实例化所有的model 要根据集成的对象定义的model实例化 BaseRepository.php <?php namespace App\Repository; class ...
随机推荐
- MVC-07 案例2
二.电子商务网站 掌握该网站的开发流程和设计思路,并为数据模型中商品.商品分类,这两个类编写代码. 1.需求分析 2.数据模型规划 (1)商品类别 (2)商品信息 (3)会员信息 (4)购物车项目 ( ...
- TCP编程的一个小例子
TCP程序的服务器端与客户端的流程图 例子:服务器端等待客户端连接,若连接成功,则用户可以通过客户端向服务器端发送任意字符串,服务器端在收到字符串后,输出相关信息,在把接受到的字符串重新发生给客户端. ...
- How many prime numbers(求素数个数)
How many prime numbers Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- block 解析 - 成员变量
回顾 在 上一篇 中我们讲了截获变量特性,对于局部变量,变量不加__block修饰符,在block内部是无法修改变量的值.而且 对值类型的修改,如果block初始化后,无法同步到block内部 对于指 ...
- c基础总结
机器大小端判断: #include <stdio.h> typedef union{ char x; int i; }un; int main() { un tt; tt.i = ; ) ...
- Webform中Repeater控件--绑定嵌入C#代码四种方式
网页里面嵌入C#代码用的是<% %>,嵌入php代码<?php ?> 绑定数据的四种方式: 1.直接绑定 <%#Eval("Code") %> ...
- mbed 初试(LinkNode 板卡)(2016-04-21)
前言 感谢论坛,感谢 LinkSrite,论坛活动申请了一个 LinkNode,体验了一下 mbed. 翻看完官方 wiki,大概了解了一下 mbed 的开发,然后做了 blink 和 pwm 的测试 ...
- BZOJ 1677: [Usaco2005 Jan]Sumsets 求和( dp )
完全背包.. --------------------------------------------------------------------------------------- #incl ...
- JavaScripts+jquery
选择器 参数 element 一个用于搜索的元素.指向DOM节点的标签名. <div>div1</div> <div>div2</div> <sp ...
- python--data type
1.Python中常见的数据类型有: 数据类型 内建函数 整型 int(),long() 浮点型 float() 字符串型 str() 列表 list() 元组 t ...