$this
- специальная переменная в PHP , которая не может быть назначена. Если он доступен в контексте, где он не существует, эта фатальная ошибка указывается.
Эта ошибка может возникнуть:
class Foo {
protected $var;
public function __construct($var) {
$this->var = $var;
}
public static function bar () {
// ^^^^^^
echo $this->var;
// ^^^^^
}
}
Foo::bar();
Как исправить: снова просмотрите свой код, $this
может использоваться только в контексте объекта и никогда не должен использоваться в статическом методе. Кроме того, статический метод не должен обращаться к нестатистическому свойству. Используйте self::$static_property
для доступа к статическому свойству. $this
переменная. Как исправить: Просмотрите код и замените $this
на другую переменную замещения. Вопросы, относящиеся:
Я обычно вижу и использую или "AddCore" или "InnerAdd"
О, я забыл упоминать, почему я делаю это. Это - потому что это - простой способ создать обработку при помощи цикла для методов, которые я хотел бы назвать в последовательности. Например, если у меня есть некоторая проверка, которая должна быть сделана немного отличающаяся каждый раз, но методы использования с тем же классом. Я настроил их как
add_process = array(1,2,3);
delete_process = array(2,6,4);
//delete user, users posts and users comments
foreach( process2 as value){
method_{value}_delete
}
Я встретился с этим соглашением много, к сожалению, наряду с тенденцией назвать средства управления на форме с начальным символом подчеркивания (например, "_txtFirstname" вместо просто "txtFirstname"). Это, кажется, странный bleedover эффект от no-longer-MS-recommended практики именования частных переменных с начальным символом подчеркивания. Это или программисты просто любит использовать ключ подчеркивания ни по какой причине, которую я могу выяснить.
не используют это соглашение, и когда Ваш коллега настаивает на нем, бросьте вызов ему находить что-то ( что-либо ) онлайн, который рекомендует эту практику.
Будьте описательными с именами методов для создания кода, который объясняется, не должно быть никаких коллизий, потому что у Вас не должно быть двух методов, делающих точно то же самое, таким образом, у Вас не должно быть причины нуждаться в символе для добавления префикса имен методов.
Некоторые люди префикс частные поля с "m _", я не видел подобных стилей для закрытых методов.
Я думаю с большинством соглашений на частном материале существует больше свободы. Однако я вижу это много:
private Vector AddCore(Vector vector)
или
private Vector DoAdd(Vector vector)
Однако я, вероятно, отбросил бы частное, добавляет метод и просто имеет тот:
public static Vector Add(Vector vector1, Vector vector2)
{
// check if vector1 is null
Vector returnVector = vector1.Clone()
return returnVector.Add(vector2);
}
public Vector Add(Vector vector)
{
// check parameters for null, and compare Lengths
for (int index = 0; index < Length; index++) {
this[index] += vector[index];
}
return this;
}
Также помещает те фигурные скобки в правильное пятно:-)
Я пошел бы для того, что мои предложенные товарищи по команде и делают это соглашение в команде. Но в особом случае похоже, что Вы могли избежать его:
public Vector Add(Vector vector) {
// check vector for null, and compare Length to vector.Length
for (int index = 0; index < Length; index++) {
this[index] += vector[index];
}
return this;
}
public static Vector Add(Vector vector1, Vector vector2) {
// check parameters for null, and compare Lengths
Vector returnVector = vector1.Clone()
return returnVector.Add(vector2);
}
Или возможно я просто не должен идти ТАК это поздно...
Два изменения, которые я видел наиболее часто используемый, являются ими:
private Vector DoAdd(Vector vector) { ... }
и
private Vector AddImpl(Vector vector) { ... }
Никакой не является особенно удовлетворительным, но они - то, что я видел.
я никогда не видел соглашение, что ВСЕ закрытые методы должны иметь префикс - простая мысль о нем заставляет меня дрожать!
Это плохо достаточно имеет дело со всеми разработчиками C++, которые снабжают префиксом каждого участника в поле зрения "_" - и я говорю как бывший разработчик Дельфи, который раньше снабжал префиксом каждого участника "F". Я все еще восстанавливаюсь с этого!
Так как общественность Добавляет (), делает некоторые проверки, и частное не делает:
private Vector AddUnchecked(Vector vector) {
for (int index = 0; index < Length; index++) {
this[index] += vector[index];
}
return this;
}
Лично, для методов, у меня есть то же соглашение о присвоении имен независимо от видимости.
Это мои соглашения о присвоении имен для C#:
Редактирование : Отметьте, я виновен в использовании имен префикса закрытых методов. Я не поймал ту конкретную часть Вашего вопроса в первый раз, когда я считал его.
, Например, если у меня есть 7 различных способов выполнить мой SQL-оператор через мой класс DatabaseCommand, как QueryDataTable, QueryEnumerable, QueryEnumerable<T>
, QueryDataReader, и т.д. тогда, все они хотят назвать те же закрытые методы, у меня есть тенденция назвать этот метод InternalQuery или PrivateQuery.
Я обычно использую thisCase для закрытых методов и ThatCase для открытых методов.
private Vector add(Vector vector) {
for (int index = 0; index < Length; index++) {
this[index] += vector[index];
}
return this;
}
public Vector Add(Vector vector) {
for (int index = 0; index < Length; index++) {
this[index] += vector[index];
}
return this;
}
Я никогда не видел соглашения кодирования в C#, который различал открытые и закрытые методы. Я не предлагаю делать его, так как я не вижу преимущества.
, Если имя метода конфликтует с открытыми методами, it’s время для становления более описательным; если, как в Вашем случае, это содержит фактический метод реализация для открытого метода, одно соглашение состоит в том, чтобы назвать его *Impl
. Т.е. AddImpl
в Вашем случае.
Довольно распространено использовать начальный символ подчеркивания для частных собственностей, но я никогда не видел сделанный на методах