我有两个班级
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();
答案 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。