PHP方法获取2种类型的对象

PHP方法获取2种类型的对象,php,methods,arguments,Php,Methods,Arguments,是否可以在方法函数中设置类似的内容 class myClass{ public function myMethod($variable stdClass || otherClass){ } } 我想这样做,在我的myMethod中可以传递两种类型的对象,这在PHP中是可能的?您不需要设置类型,PHP允许您: class myClass { public function myMethod($variable) { } } 如果它必须是两种类型中的一种,您可以在方法内

是否可以在方法函数中设置类似的内容

class myClass{

 public function myMethod($variable stdClass || otherClass){
 }

}

我想这样做,在我的
myMethod
中可以传递两种类型的对象,这在PHP中是可能的?

您不需要设置类型,PHP允许您:

class myClass {
    public function myMethod($variable) {

    }
}
如果它必须是两种类型中的一种,您可以在方法内部检查它,并添加一个PHPDoc块来告诉读者
$variable
可以是什么类型:

class myClass {

    /**
     * @param stdClass|myClass $variable
     *
     * @throws InvalidArgumentException in case $variable is not one of the above classes.
     */
    public function myMethod($variable) {
        if (!($variable instanceof stdClass || $variable instanceof myClass)) {
            throw new InvalidArgumentException('$variable must be either an stdClass or myClass');
        }

    }

}

您不需要设置类型,PHP允许您:

class myClass {
    public function myMethod($variable) {

    }
}
如果它必须是两种类型中的一种,您可以在方法内部检查它,并添加一个PHPDoc块来告诉读者
$variable
可以是什么类型:

class myClass {

    /**
     * @param stdClass|myClass $variable
     *
     * @throws InvalidArgumentException in case $variable is not one of the above classes.
     */
    public function myMethod($variable) {
        if (!($variable instanceof stdClass || $variable instanceof myClass)) {
            throw new InvalidArgumentException('$variable must be either an stdClass or myClass');
        }

    }

}

您不需要在方法定义中编写类型。您可以允许在PHP中使用任何类型的参数。如果要检查,您可以稍后执行以下操作:

public function myMethod($var) {
    if(class_name($var) == "MyClass1") { 
        // do something
    } 
    elseif(class_name($var) == "MyClass2") { 
        // do something elese
    } 
    else { 
        // Error
    }
}

您不需要在方法定义中编写类型。您可以允许在PHP中使用任何类型的参数。如果要检查,您可以稍后执行以下操作:

public function myMethod($var) {
    if(class_name($var) == "MyClass1") { 
        // do something
    } 
    elseif(class_name($var) == "MyClass2") { 
        // do something elese
    } 
    else { 
        // Error
    }
}

在PHP中,您不必使用精确的参数类型。这是一个名为的新功能,不需要使用它

您要做的唯一一件事就是处理这样一个事实:您的参数可以是一个类或另一个类的实例。您可以使用来检查它:

class myClass {
    public function myMethod($param) {
        if($param instanceof MyClass1){
        }
        else if($param instanceof MyClass2){
        }
        ...
    }
}

在PHP中,您不必使用精确的参数类型。这是一个名为的新功能,不需要使用它

您要做的唯一一件事就是处理这样一个事实:您的参数可以是一个类或另一个类的实例。您可以使用来检查它:

class myClass {
    public function myMethod($param) {
        if($param instanceof MyClass1){
        }
        else if($param instanceof MyClass2){
        }
        ...
    }
}

这是不可能的!您可以传递实现一个的对象,或者尝试使用模式,或者只传递变量

 public function myMethod($var) {
    if($var instanceof MyClass) {

    }
 }

这是不可能的!您可以传递实现一个的对象,或者尝试使用模式,或者只传递变量

 public function myMethod($var) {
    if($var instanceof MyClass) {

    }
 }

如果要控制输入参数,请改用接口或抽象类:

class MyClass {

    public function doSomething(IExpectedObject $input)
    {
        ...
    }

}

interface IExpectedObject{}

class A implements IExpectedObject {}
class B implements IExpectedObject {}
class C {}
在这种情况下,类A和B将通过,而类C将失败,如果您的方法希望某种类型的对象以相同的方式处理它们,而不关心它是A还是B对象,那么这是有用的


这也可以通过继承完成,具体取决于您的需要。

如果您想控制输入参数,请使用接口或抽象类:

class MyClass {

    public function doSomething(IExpectedObject $input)
    {
        ...
    }

}

interface IExpectedObject{}

class A implements IExpectedObject {}
class B implements IExpectedObject {}
class C {}
在这种情况下,类A和B将通过,而类C将失败,如果您的方法希望某种类型的对象以相同的方式处理它们,而不关心它是A还是B对象,那么这是有用的



这也可以通过继承来实现,具体取决于您的需要。

不需要在PHP中描述参数类型,为什么要这样做?我的理解是,您不必将特定类型作为参数传递。因为我不想做类似于公共函数myMethod($variable)的事情{if($variable instanceof stdClass){}if($variable instanceof otheClass){}}不需要在PHP中描述参数类型,为什么要这样做?我的理解是,您不必将特定类型作为参数传递。因为我不想做类似于公共函数myMethod($variable){if($variable instanceof stdClass){}if($variable instanceof otheClass){}}是的,我知道,但是我想避免stdClass的if$variable instanceof和otheClass的if$variable instanceof,而不是做些什么。我想在参数传递到方法体时检查对象的类型。目前还没有办法。即使类型搜索也不允许两个方法具有相同的名称,即使参数不同。您始终可以使用不同的设计模式来处理这种情况,但这始终是一样的:打开参数类。最干净的方法是使用接口,让两个类实现它,并通过声明参数是该接口的实例来使用类型暗示。但这是同一个IMO,我不知道这种模式,在两个类之间没有其他链接,只有被同一个方法作为参数。是的,我知道,但我想避免如果$variable instanceof stdClass,如果$variable instanceof otheClass,而不是做些什么。我想在参数传递到方法体时检查对象的类型。目前还没有办法。即使类型搜索也不允许两个方法具有相同的名称,即使参数不同。您始终可以使用不同的设计模式来处理这种情况,但这始终是一样的:打开参数类。最干净的方法是使用接口,让两个类实现它,并通过声明参数是该接口的实例来使用类型暗示。但这是同一个IMO,我不知道这种模式,两个类之间没有其他联系,只有被同一个方法作为参数。这真的是一个好的实践吗?在我看来,创建一个只用于声明参数类型的接口似乎有些过分。特别是如果两个类之间绝对没有函数链接。你会为你得到的每种类型的方法创建一个接口吗?正如我在回答中所说的,当方法处理它们而不关心它们的类时,使用接口是一个很好的实践。由于他在示例中使用了“stdClass”,我假设后面的对象需要特定的处理。在我看来,我看不出一个方法应该能够接受和处理任何给定给它的对象,当你用同一个方法处理多个对象类型时,应用相同的操作不是吗?“这两个类之间没有功能联系”,所以在这种情况下,为什么使用相同的处理方法(请原谅我的英语)是的,我同意你的看法,这种问题来自概念问题。如果相同的方法适用于两个类,那么这些类应该通过继承共享一些方法和属性。但我仍然认为肌酸