PHP类扩展了一个公共变量

时间:2012-07-18 12:39:53

标签: php

我有两个班级

class validate {
    public $mediaFlag;

    function ValidateTypeOfMedia($SOEmag,$SOEtab,$Soct,$DAL,$insertMeda,$other){    
        if($SOEmag==""){
            return "Must select Media Type";
        }
        else{
            $this->mediaFlag=1;
        }
    }

    function whatever()
    {
        if( $this->mediaFlag==1)
        {
            echo "flag is here";
        }
        else {
            echo "flag didn't work";
        }
    }
}/// Class validate Ends


class InsertINDB extends validate 
{

    function test(){
        if( $this->mediaFlag==1)
        {
            echo "flag is here";
        }
        else {
            echo "flag didn't work";
        }
    }
}

我遇到的问题是在insertINDB类中,函数测试无法识别mediaFlag变量已被设置...但是,父类中的函数确实如此识别。所以我的问题,如何在类InsertINDB中的函数测试不知道该标志已在父类中设置。

$object_validate= new validate;

$object_DB= new InsertINDB;

$object_validate->whatever();
$object_DB->test();

2 个答案:

答案 0 :(得分:2)

从我看到的 - 在设置了标志的情况下,设置了一些东西 - 没有默认值。问题不在于validate的扩展,您只需在InsertINDB中访问公共属性之前不将其设置为任何值。例如,在第一种情况下调用ValidateTypeOfMedia,在第二种情况下调用{。}}。

编辑:第二种情况下OR $SOEma == ""的计算结果为true,而ValidateTypeOfMedia未将该标志设置为1。

BTW imho你的代码看起来不正确,不是最佳实践,无论你想要实现什么(绝不试图侮辱你)。

edit2:

这些结果是什么,我打赌在两种情况下都没有设置标志:

$object_validate= new validate;

$object_DB= new InsertINDB;

$object_validate->whatever();

$object_DB->test();

EDIT3:

Khanquered Pro,基于你的评论 - 你可能不理解多态的目的。所以要解释一下 - 在扩展第一个类之后,你创建了一个子实例(在你的例子中是InsertINDB)。然后该实例包含validate的所有方法(函数)和属性。你不能先在一个实例中调用validate,然后期望它的属性在子类中可用 - 在这种情况下,每个实例都是完全分离的,它们有自己的属性值(state)。因此,在扩展validate之后,您只与子项一起工作 - 使用它来验证,使用它来插入db。并且只在需要验证数据而不插入任何内容的应用程序中使用partent validate

我不会评论整个架构是否是好主意 - 它超出了问题的范围,可能是您当前的知识,但在您成功完成任务后,请阅读有关OOP主题的更多内容。

答案 1 :(得分:2)

这里的问题是对扩展类如何工作的误解,以及类和对象之间的区别。

执行$var = new ClassName时,您可以根据类实例化对象。此对象不再直接连接到类,并且从同一个类更改另一个实例中的值不会影响其他实例。

相同的主体适用于扩展其他类的类 - 一旦实例化,一个对象与每个其他对象分开,无论它们是来自同一个类还是来自其父类/子类。

我们举一个简单的例子:

class Bob {

  public $property = 1;

}

class Dave extends Bob {
}

$bob = new Bob;
$dave = new Dave;

echo $bob->property; // 1
echo $dave->property; // 1

$bob->property = 2;

echo $bob->property; // 2
echo $dave->property; // 1

使用static成员(有时也称为 class 成员)可以获得您期望的行为。

我认为值得您回到手册并重新阅读OOP chapter