/ / Como eu posso imitar a sobrecarga de estilo C ++ neste código PHP [closed] - php, oop, polimorfismo, sobrecarga

Como posso imitar a sobrecarga de estilo C ++ neste código PHP [closed] - php, oop, polimorfismo, sobrecarga

Eu tenho uma função estática no PHP:

public static function func( $foo, $bar ) {

}

Onde $bar é um inteiro. Eu quero implementar um semelhante func mas onde $bar é uma string. Em C ++ eu usaria sobrecarga, mas a documentação do PHP mostra que a sobrecarga não faz o mesmo que o C ++. Existe alguma outra maneira que eu possa conseguir o que eu quero?

Um alterador que eu pensei é algum polimorfismo, mas parece um pouco exagerado:

Faça uma interface com func definido (sem implementação) e apenas implementá-lo de duas maneiras diferentes. Assim:

interface Something {
public static function func( $foo, $bar );
}

class Something1 implements Something {
public static function func( $foo, $bar ) {
// some implementation
}
}

class Something2 implements Something {
public static function func( $foo, $bar ) {
// some other implementation
}
}

Muito Obrigado.

Respostas:

2 para resposta № 1

Sobrecarga no sentido de C ++ ou qualquer outrolinguagem tipada estática não faz sentido em php, porque você não precisa fazer uma dica de tipo. Essa é a natureza de idiomas fracamente tipados e por isso não seria um benefício em ter esse recurso em php. Você pode passar qualquer variável de qualquer tipo para sua função. No caso de objetos, você tem polimorfismo sem ter que usar herança / interfaces para obter um comportamento polimótico. Isso é chamado de tipagem de pato.

Se você precisar de implementação diferente para string / int, apenas verifique o tipo e forneça a implementação na mesma função.


0 para resposta № 2

Crie uma função e, dependendo do tipo desse parâmetro, faça coisas diferentes ou chame as funções reais, func_int e funct_string. Você está efetivamente fazendo o despacho você mesmo.

Para verificar o tipo, existem gettype, e as is_.. funções.


0 para resposta № 3

Algo como isso poderia ajudar, você identifica qual é o tipo $ bar e, em seguida, chama a função correspondente.

public static function func( $foo, $bar ) {
if (is_int($bar)) {
self::funcBarInteger($foo, $bar);
} else {
self::funcBarString($foo, $bar);
}
}

public static function funcBarInteger( $foo, $bar ) {

}

public static function funcBarString( $foo, $bar ) {

}