PHP类扩展了一个公共变量


PHP class extends a public variable

我有两个类

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();

您的问题是对扩展类的工作原理以及类和对象之间的区别的误解。

执行$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的完整章节。

从我所看到的情况来看,在设置了标志的情况下,没有默认值。问题不在于validate的扩展,只是在InsertINDB中访问公共属性之前没有将其设置为任何值。Eg在第一种情况下调用ValidateTypeOfMedia,在第二种情况下不调用。

edit: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,然后期望它的属性在子类中可用——每个实例都是完全分离的——在这种情况下,它们有自己的属性值(state)。因此,在扩展validate之后,您只能处理子级——使用它进行验证,使用它插入数据库。只有在应用程序中需要验证数据而不插入任何内容的情况下,才可以使用partent validate

我不会评论整个体系结构是否是个好主意——它超出了问题的范围,可能也超出了你目前的知识范围,但在你成功完成任务后,首先阅读更多关于OOP的主题。