php 的baby parent药膏说明书是不是不能直接使用,必须在方法里才能用啊

本文出自汗血宝马,转载时请注明出处及相应链接。
本文永久链接: http://www.caotama.com/42675.html
Ɣ回顶部在学习PHP 这种语言中你会发现, PHP中的方法是不能重载的, 所谓的方法重载就是定义相同的方法名,通过&参数的个数&不同或&参数的类型&不 同,来访问我们的相同方法名的不同方法。但是因为PHP是弱类型的语言, 所以在方法的参数中本身就可以接收不同类型的数据,又因为PHP的方法可以接收不定个数的参数,所以通过传递不同个数的参数调用不相同方法名的不同方法也是不成立的。所以在PHP里面没有方法重载。不能重载也就是在你的项目中不能定义相同方法名的方法。另外,因为PHP没有名子空间的概念,在同一个页面和被包含的页面中不能定义相同名称的方法, 也不能定义和PHP给我提供的方法的方法重名,当然在同一个类中也不能定义相同名称的方法。
我们这里所指的重载新的方法所指的是什么呢?其实我们所说的重载新的方法就是子类覆盖父类的已有的方法,那为什么要这么做呢?父类的方法不是可以继承过 来直接用吗?但有一些情况是我们必须要覆盖的,比如说我们前面提到过的例子里面, &Person&这个人类里面有一个&说话&的方法,所有继承&Person&类的子类都是可以&说话&的, 我们&Student&类就是&Person&类的子类,所以&Student&的实例就可以&说话&了, 但是人类里面&说话&的方法里面说出的是&Person&类里面的属性, 而&Student&类对&Person&类进行了扩展,又扩展出了几个新的属性,如果使用继承过来的&say()&说话方法的话,只能说出从 &Person&类继承过来的那些属性,那么新扩展的那些属性使用这个继承过来的&say()&的方法就说不出来了,那有的人就问了,我在 &Student&这个子类中再定义一个新的方法用于说话,说出子类里面所有的属性不就行了吗?一定不要这么做, 从抽象的角度来讲, 一个&学生&不能有两种&说话&的方法,就算你定义了两个不同的说话的方法,可以实现你想要的功能,被继承过来的那个&说话&方法可能没有机会用到了,而 且是继承过来的你也删不掉。这个时候我们就要用到覆盖了。
虽然说在PHP里面不能定义同名的方法, 但是在父子关系的两个类中,我们可以在子类中定义和父类同名的方法,这样就把父类中继承过来的方法覆盖掉了。
// 定义一个"人"类做为父类
class Person {
// 下面是人的成员属性
// 人的名子
// 人的性别
// 人的年龄
// 定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值
function __construct($name, $sex, $age) {
$this-&name = $
$this-&sex = $
$this-&age = $
// 这个人可以说话的方法, 说出自己的属性
function say() {
echo "我的名子叫:" . $this-&name . " 性别:" . $this-&sex . " 我的年龄是:" . $this-&
class Student extends Person {
var $ // 学生所在学校的属性
// 这个学生学习的方法
function study() {
echo "我的名子叫:" . $this-&name . " 我正在" . $this-&school . " 学习";
// 这个学性可以说话的方法, 说出自己所有的属性,覆盖了父类的同名方法
function say() {
echo "我的名子叫:" . $this-&name . " 性别:" . $this-&sex . " 我的年龄是:" . $this-&age . " 我在" . $this-&school . "上学";
上面的例子, 我们就在&Student&子类里覆盖了继承父类里面的&say()&的方法,通过覆盖我们就实现了对&方法&扩展。但是,像这样 做虽然解决了我们上面说的问题,但是在实际开发中,一个方法不可能就一条代码或是几条代码,比如说&Person&类里面的&say()&方法有里面有 100条代码,如果我们想对这个方法覆盖保留原有的功能外加上一点点功能,就要把原有的100条代码重写一次, 再加上扩展的几条代码,这还算是好的,而有的情况,父类中的方法是看不见原代码的,这个时候你怎么去重写原有的代码呢?我们也有解决的办法,就是在子类这 个方法中可以调用到父类中被覆盖的方法, 也就是把被覆盖的方法原有的功能拿过来再加上自己的一点功能,可以通过两种方法实现在子类的方法中调用父类被覆盖的方法:
一种是使用父类的&类名::&来调用父类中被覆盖的方法;
一种是使用&parent::&的方试来调用父类中被覆盖的方法;
class Student extends Person {
var $ // 学生所在学校的属性
// 这个学生学习的方法
function study() {
echo "我的名子叫:" . $this-&name . " 我正在" . $this-&school . "学习";
// 这个学性可以说话的方法, 说出自己所有的属性,覆盖了父类的同名方法
function say() {
// 使用父类的"类名::"来调用父类中被覆盖的方法;
// Person::say();
// 或者使用"parent::"的方试来调用父类中被覆盖的方法;
parent::say();
// 加上一点自己的功能
echo "我的年龄是:" . $this-&age . " 我在" . $this-&school . "上学";
现在用两种方式都可以访问到父类中被覆盖的方法,我们选那种方式最好呢?用户可能会发现自己写的代码访问了父类的变量和函数。如果子类非常精炼或者父类非 常专业化的时候尤其是这样。 不要用代码中父类文字上的名字,应该用特殊的名字 parent,它指的就是子类在 extends 声明中所指的父类的名字。这样做可以避免在多个地方使用父类的名字。如果继承树在实现的过程中要修改,只要简单地修改类中 extends 声明的部分。
同样,构造方法在子类中如果没有声明的话,也可以使用父类中的构造方法,如果子类中重新定义了一个构造方法也会覆盖掉父类中的构造方法,如果想使用新的构造方法为所有属性赋值也可以用同样的方式。
class Student extends Person {
var $ // 学生所在学校的属性
function __construct($name, $sex, $age, $school) {
// 使用父类中的方法为原有的属性赋值
parent::__construct($name, $sex, $age);
$this-&school = $
// 这个学生学习的方法
function study() {
echo "我的名子叫:" . $this-&name . " 我正在" . $this-&school . " 学习";
// 这个人可以说话的方法, 说出自己的属性
function say() {
parent::say();
// 加上一点自己的功能
echo "我的年龄是:" . $this-&age . " 我在" . $this-&school . "上学";
阅读(...) 评论()扫一扫体验手机阅读
php中static关键字
那么static关键字在php中与C#中都有些什么不同呢?声明范围相对C#来说,PHP中static变量的使用范围要更广一些,我们不仅可以在类,方法或变量前面添加 static修饰符,我们甚至还能给函数内部变量添加static关键字。添加了static修饰符的变量即使在该函数执行完毕值仍然不会丢失,也就是说,在下一次调用这个函数时,变量仍然记得原来的值。如:view sourceprint?&?php& function test()& {&&& static $var1=1;&&& $var1+=2;&&& echo $var1.' ';& }&&&& test();&&& test();&&& test();?& 运行结果如下:
这里有一点需要注意的是,变量的赋值操作只会在变量第一次初始化时会被调用,在之后函数的执行过程中,这个操作不会被调用。
由于PHP中函数同样是一等公民,所以不同于C#,我们可以直接定义函数,并直接在代码的任何地方调
用,这一点跟javascript倒是有些相似。因此这时候函数静态变量会比定义全局变量更加有用,它可以避免变量重复定义导致冲突。而由于C#中函数无
法直接定义和调用,它必须寄宿在类中,所以如果函数需要静态变量,我们只需要在类中定义便能达到相同效果。
C#中,我们调用静态成员的方式非常简单和一致,因为静态成员不属于实例对象,所以无论是方法还是变量,C#对其静态成员的访问方式一律是通过类名.方法(变量)进行。并且在C#中,静态函数是不能被设置为虚方法或者覆盖的。而PHP对此则提供了更为灵活多样的支持。
首先,我们知道PHP中调用实例方法都是通过如:someobj-&someFun()调用,那
么我们调用静态函数是否也能像C#那样通过SomeClass-&someFun()调用呢?答案是否定的,在PHP中,对静态成员的调用只能通
过::的方式进行,如:SomeClass::someFun()。&&?php&&& class TestC&&& {&&& &&& public static $var1=1;&&& &&& public $var2=1;&&& &&& function t1()&&& &&& {&&& &&&&&&& self::$var1+=2;&&& &&&&&&& echo self::$var1.' ';&&& &&&&&&& echo $this-&var2.' ';&&& &&& }&&& &&& public static function t2()&&& &&& {&&& &&&&&&& self::$var1+=2;&&& &&&&&&& echo self::$var1.' ';&&& &&& }&&& }&&& $t=new TestC();&&& $t-&t1();&&& TestC::t2();&?&运行结果如下:
在类中的方法中,如果我们需要调用静态变量,必须通过self::$somVar静态变量(注意变量前面的$符号,实例变量不需要),而调用静态方法则为self::someFun()(这里不需要$符号)。如上例。
在java中子类只能将父类的同名的静态方法隐藏不能覆盖,而非静态的则进行覆盖,PHP中,子类是可以覆盖父类的静态函数或变量的,不仅如此,由于默认self::staticFun()调用的是子类的静态函数,这个时候如果我们想
调用父类的静态变量怎么办呢?这里PHP提供了额外的parent来调用基类的静态成员。如:&&?php&&& class Test1&&& {&&& &&& public static $var1=1;&&& &&& public static function t2()&&& &&& {&&& &&&&&&& self::$var1+=2;&&& &&&&&&& echo self::$var1.' ';&&& &&& }&&& }&&& class Test2 extends Test1&&& {&&& &&& static $var1=‘Hello’;&&& &&& static function t2()&&& &&& {&&&&&&& parent::t2();&&& &&&&&&& echo self::$var1.' ';&&& &&& }&&& }&&& Test1::t2();&&& Test2::t2();&& ?& 运行结果如下:
3&5&‘Hello’&
最好,根据上面的例子我们很容易想到,子类访问父类可以使用parent关键字,那么父类如何访问子类的静态方法呢?这里给出static的另外一个用法,这里如果将调用的静态方法前面的作用域换成static的话,PHP会根据该类的继承层次来计算最终的静态方法。如:&&?php&&& class Test1&&& {&&& &&& function t1()&&& &&& {&&& &&&&&&& static::t2();&&& &&& }&&& &&& public static function t2()&&& &&& {&&& &&&&&&& echo self::'Test1 ';&&& &&& }&&& }&&& class Test2 extends Test1&&& {&&& &&& static function t2()&&& &&& {&&& &&&&&&& echo self::'Test2 ';&&& &&& }&&& }&&& $t=new Test2();&&& $t-&t1();&&& Test2::t2();& ?&
运行结果如下:
Test2 Test2
这里t实例在t1方法调用t2静态方法时,会根据其实例找到最终的静态方法并输出Test2。
<span type="1" blog_id="692720" userid='
182篇文章,14W+人气,0粉丝
<span type="1" blog_id="692720" userid='php实现parent调用父类的构造方法与被覆写的方法
转载 &更新时间:日 15:06:38 & 作者:woshisap
这篇文章主要介绍了php实现parent调用父类的构造方法与被覆写的方法,在上一篇关于使用类继承解决代码重复问题的基础上,进一步分析了parent调用父类的构造方法与被覆写的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
本文实例讲述了php实现parent调用父类的构造方法与被覆写的方法。分享给大家供大家参考。具体分析如下:
覆写:被重新设计。
在子类中定义构造方法时,需要传递参数给父类的构造方法,否则我们得到的可能是一个构造不完整的对象。
要调用父类的方法,首先要找到一个引用类本身的途径:句柄(handle),PHP为此提供了parent关键字。
parent 调用父类的构造方法
要引用一个类而不是对象的方法,可以使用 ::(两个冒号),而不是 -&。
所以, parent::__construct() 以为着调用父类的 __construct() 方法。
修改上篇《》中的代码,让每个类只处理自己的数据:
代码如下:&&#63;php
header('Content-type:text/charset=utf-8');
// 从这篇开始,类名首字母一律大写,规范写法
class ShopProduct{&&& // 声明类
public $ // 声明属性
public $producerMainN
public $producerFirstN
function __construct($title,$firstName,$mainName,$price){
$this -& title = $&&& // 给属性 title 赋传进来的值
$this -& producerFirstName= $firstN
$this -& producerMainName = $mainN
$this -& price= $
function getProducer(){&&& // 声明方法
return "{$this -& producerFirstName }"."{$this -& producerMainName}";
function getSummaryLine(){
$base = "{$this-&title}( {$this-&producerMainName},";
$base .= "{$this-&producerFirstName} )";
class CdProduct extends ShopProduct {
public $playL
function __construct($title,$firstName,$mainName,$price,$playLenth){
parent::__construct($title,$firstName,$mainName,$price);
$this -& playLenth= $playL
function getPlayLength(){
return $this -& playL
function getSummaryLine(){
$base = "{$this-&title}( {$this-&producerMainName},";
$base .= "{$this-&producerFirstName} )";
$base .= ":playing time - {$this-&playLength} )";
class BookProduct extends ShopProduct {
public $numP
function __construct($title,$firstName,$mainName,$price,$numPages){
parent::__construct($title,$firstName,$mainName,$price);
$this -& numPages= $numP
function getNumberOfPages(){
return $this -& numP
function getSummaryLine(){
$base = "{$this-&title}( {$this-&producerMainName},";
$base .= "{$this-&producerFirstName} )";
$base .= ":page cont - {$this-&numPages} )";
每个子类都会在设置自己的属性前调用父类的构造方法。基类(父类)现在仅知道自己的数据,而我们也应该尽量避免告诉父类任何关于子类的信息,这是一条经验规则,大家想想如果某个子类的信息应该是”保密“的,结果父类知道它的信息,其它子类可以继承,这样子类的信息就不保密了。
parent 调用父类被覆写的方法
parent 关键字可以在任何覆写父类的方法中使用。覆写一个父类的方法时,我们并不希望删除父类的功能,而是拓展它,通过在当前对象中调用父类的方法可以达到这个目的。
  看看上面的代码,可以发现两个子类中 getSummaryLine() 方法中重复了许多代码,我们应该利用 ShopProduct 类中已经存在的功能,而不是重复开发:
代码如下:// 父类:ShopProduct
function getSummaryLine(){
$base = "{$this-&title}( {$this-&producerMainName},";
$base .= "{$this-&producerFirstName} )";
// 子类:CdProduct
function getSummaryLine(){
$base = parent::getSummaryLine();
$base .= ":playing time - {$this-&playLength} )";
// 子类:BookProduct
function getSummaryLine(){
$base = parent::getSummaryLine();
$base .= ":page cont - {$this-&numPages} )";
我们在父类 ShopProduct 中为 getSummaryLine() 方法完成了”核心“功能,接着在子类中简单的调用父类的方法,然后增加更多数据到摘要字符串,方法的拓展就实现了。
希望本文所述对大家的php程序设计有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具&&& &nbsp&nbsp&nbsp会员注册
本站不参与评论!()
自觉遵守:爱国、守法、自律、真实、文明的原则
尊重网上道德,遵守中华人民共和国各项有关法律法规
严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的评论
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
您在本站发表的评论,本站有权保留、转载、引用或者删除
参与本评论即表明您已经阅读并接受上述条款}

我要回帖

更多关于 baby parent药膏说明书 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信