PHP OOPでクラスメソッドの入力パラメータをチェックする必要があるかどうかを知る必要がありますか?
たとえば、以下の方法を想像してください。
public function show_message($message)
{
echo $message;
}
プログラマーがメッセージパラメーターをメソッドに渡さない場合の最善の解決策は何ですか? PHP に警告または実行時エラーを表示させたり、何か他のことをさせたりしますか?
PHP OOPでクラスメソッドの入力パラメータをチェックする必要があるかどうかを知る必要がありますか?
たとえば、以下の方法を想像してください。
public function show_message($message)
{
echo $message;
}
プログラマーがメッセージパラメーターをメソッドに渡さない場合の最善の解決策は何ですか? PHP に警告または実行時エラーを表示させたり、何か他のことをさせたりしますか?
「最善の」解決策は、メソッドに正確に何をさせたいかによって異なりますが、一般的には、型ヒントとデフォルト値の組み合わせをお勧めします。
class Foo
{
public function doSomething ($message = 'None')
{
echo $message;
}
public function somethingElse (array $foo = array())
{
echo '<pre>';
print_r($foo);
echo '</pre>';//will always be an array
}
public function onlyMyself (Foo $instance)
{
return $instance->doSomething('I know this method exists');
}
public function myselfOrNothing(Foo $instance = null)
{
if ($instance === null)
{
return $this->doSomething('No instance provided');
}
return $instance->doSomething('Instance provided to '.__METHOD__);
}
}
$foo = new Foo;
$bar = new Bar;
$foo->onlyMyself($bar);//works fine
$foo->onlyMyself(array());//fails
$bar->myselfOrNothing();//works
$bar->somethingElse();//ok...
など、基本的な原則が得られます。
抽象親クラス (または単なる古い親クラス) を使用している場合、親に型ヒントを与えると、子も渡すことができることに注意してください。
class Bar extends Foo
{
}
class Foobar extends Bar
{
}
$fb = new Foobar;
$b = new Bar;
public function someClass(Foo $instance)
{//accepts instances of Foo, Bar and Foobar...
echo get_class($instance);//can echo any class name
}
デフォルト値を許可してから、そのデフォルト値をトラップします。これにより、単純なデフォルトの PHP の動作ではなく、何を行うかを自分で制御できます。
public function show_message($message = "\x00")
{
if ($message === "\x00") {
// decide how critical this argument actually is, and react appropriately
throw new BadMethodCallException("The message argument is critical and must be passed to this method");
// or simply apply a default if it isn't critical
$message = 'Hello World';
}
echo $message;
}
エラーの種類は、関数の重要性と、パラメーターが存在しない場合に実行を停止する十分な理由があるかどうかに依存する必要があると思います。
入力パラメータの検証について話している場合。このようなことができます。
public function show_message($message = '') {
$result = 'No message';
if (!empty($message)) {
if (is_bool($message)) {
$result = 'It is a boolean';
}
if (is_int($message)) {
$result = 'It is a integer';
}
if (is_float($message)) {
$result = 'It is a float';
}
if (is_string($message)) {
$result = 'It is a string';
}
if (is_array($message)) {
$result = 'It is an array';
}
if (is_object($message)) {
$result = 'It is an object';
}
}
return $result;
}