Разница в том, что в js наследование, то метод substr свойственен только String'y, a в php все передается аргументом.
function Parent() {
this.method = function () {
alert('method of Parent')
}
}
var Child = new Parent();
Child.method();
// Аналогично и со String, по сути каждая новая строка - new String('abc')
// А в php же все передается параметром, и проверяется тип
function Parent2(str, i) {
if (typeof str == 'string') {
alert('i: ' + i)
} else {
alert('Не правильный тип')
}
}
Parent2('str', 2)
Parent2(2, 2)