1

我有两节课

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 中,函数 test 无法识别 mediaFlag 变量已设置...但是,父类中的任何函数都可以识别。所以我的问题是,InsertINDB 类中的函数测试为什么不知道该标志已在父类中设置。

$object_validate= new validate;

$object_DB= new InsertINDB;

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

2 回答 2

2

从我所看到的 - 在设置标志的情况下,某些东西已经设置它 - 没有默认值。问题不validate在于InsertINDB. 例如,在第一种情况下ValidateTypeOfMedia被称为,在第二种情况下,不是。

编辑:OR$SOEma == ""在第二种情况下评估为 true 并且ValidateTypeOfMedia不将标志设置为 1。

顺便说一句,您的代码看起来不正确,不是最佳实践,无论您要实现什么(绝不是试图侮辱您)。

编辑2:

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

$object_validate= new validate;

$object_DB= new InsertINDB;

$object_validate->whatever();

$object_DB->test();

编辑3:

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

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

于 2012-07-18T12:43:54.673 回答
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

您期望的行为可以通过使用静态成员(有时也称为成员)来获得。

我认为值得您回到手册并完整地重新阅读OOP 章节

于 2012-07-18T12:52:38.350 回答