首先要知道,三者执行速度是相当接近的,在大多数情况下,它们的性能差异不会对程序执行造成显著影响。因此,在考虑选择使用哪个的时候更应该注重代码的可读性和可维护性,而不是过度关注微小的性能差异。
例如file_get_contents()函数,该函数的返回值可能是string或false,这时使用 if(is_string($contents)) 就比 if($contents!==false) 具有更好的可读性,因为后者只能知道$contents是不是严格等于false,而后者还能知道是不是string数据类型,而大多时候我们需要在$contents是string数据类型的情况下进行下一步操作,使用is_string()进行判断明显更符合正常人的逻辑思维。
再举个例子,openssl_pkey_get_private()函数的返回值可能是OpenSSLAsymmetricKey或false,使用 if($key instanceof OpenSSLAsymmetricKey) 就比 if($key!==false) 具有更好的可读性,理由和上面的file_get_contents()函数类似。
总的来说,如果函数(或方法)的返回值有两种或以上数据类型,在能满足判断需求的情况下推荐使用instanceof和is_*(),因为===展示出来的信息比较少,而instanceof和is_*()能展示出更多的信息。使用is_*()能知道变量是什么数据类型,知道了数据类型就知道能对它使用什么函数;使用instanceof能知道变量是什么类,知道了类名就能使用其属性和方法。