Тест для $this
:
class Foo {
function bar() {
if (isset($this)) {
echo "Y";
} else {
echo "N";
}
}
}
$f = new Foo();
$f->bar(); // prints "Y"
Foo::bar(); // prints "N"
Редактировать: Как указывает pygorex1, вы также можете принудительно метод, который будет оцениваться статически:
class Foo {
static function bar() {
if (isset($this)) {
echo "Y";
} else {
echo "N";
}
}
}
$f = new Foo();
$f->bar(); // prints "N", not "Y"!
Foo::bar(); // prints "N"
There are times when the second parameter being a length is more convenient, and there are times when the second parameter being the "offset to stop before" is more convenient. Likewise there are times when "if I give you something that's too big, just go to the end of the string" is convenient, and there are times when it indicates a bug and should really throw an exception.
The second parameter being a length is useful if you've got a fixed length of field. For instance:
// C#
String guid = fullString.Substring(offset, 36);
The second parameter being an offset is useful if you're going up to another delimited:
// Java
int nextColon = fullString.indexOf(':', start);
if (start == -1)
{
// Handle error
}
else
{
String value = fullString.substring(start, nextColon);
}
Typically, the one you want to use is the opposite to the one that's provided on your current platform, in my experience :)
Я привык к языкам, где substring () (или substr ()) занимает два параметры: начальная позиция и длина. Это объективно лучше чем способ, которым это делает Java, и если да, Вы можете это доказать?
Нет, объективно не лучше. Все зависит от контекста, в котором вы хотите его использовать. Если вы хотите извлечь подстроку определенной длины, это плохо, но если вы хотите извлечь подстроку, которая заканчивается, скажем, первым вхождением "." в строке это лучше, чем если бы вам сначала нужно было вычислить длину. Возникает вопрос: какое требование встречается чаще? Я бы сказал последнее. Конечно, лучшим решением было бы иметь обе версии в API, но если вам все время нужна версия, основанная на длине, использование статического служебного метода не так уж и ужасно.
Что касается исключения, да, это определенно хороший дизайн. Вы просили что-то конкретное, и когда вы не можете получить эту конкретную вещь, API не должен пытаться угадать, что вы могли бы захотеть вместо этого - таким образом,
Если вы не указали второй параметр , он перейдет в конец строки без необходимости вычислять его.
второй параметр должен быть необязательным, первый параметр должен принимать отрицательные значения ..
Если вы уберете это, проблема должна перестать беспокоить ваши сны, и вы наконец добьетесь хорошего ночного отдыха:
public String skipsSubstring(String s, int index, int length) {
return s.subString(index, index+length);
}
Получив некоторую обратную связь, я вижу, когда полезен сценарий второго параметра в качестве индекса, но до сих пор все эти сценарии, похоже, обходят другие ограничения языка / API. Например, API не предоставляет удобную процедуру для выдачи мне строк до и после первого двоеточия во входной строке, поэтому вместо этого я получаю индекс этой строки и вызываю substring (). (И это объясняет, почему второй параметр позиции в substr () превышает желаемый индекс на 1, ИМО.)
Мне кажется, что с более полным набором функций обработки строк в инструментарии языка второй параметр Сценарий -as-index проигрывает второму параметру по длине. Но кто-нибудь, пожалуйста, напишите мне контрпример. :)