Соглашение о присвоении имен закрытого метода [закрывается]

Неустранимая ошибка: использование $ this, если не в контексте объекта

$this - специальная переменная в PHP , которая не может быть назначена. Если он доступен в контексте, где он не существует, эта фатальная ошибка указывается.

Эта ошибка может возникнуть:

  1. Если нестатический метод называется статическим , Пример:
    class Foo {
       protected $var;
       public function __construct($var) {
           $this->var = $var;
       }
    
       public static function bar () {
           // ^^^^^^
           echo $this->var;
           //   ^^^^^
       }
    }
    
    Foo::bar();
    
    Как исправить: снова просмотрите свой код, $this может использоваться только в контексте объекта и никогда не должен использоваться в статическом методе. Кроме того, статический метод не должен обращаться к нестатистическому свойству. Используйте self::$static_property для доступа к статическому свойству.
  2. Если код из метода класса был скопирован в нормальную функцию или только глобальную область и , сохраняя специальную функцию $this переменная. Как исправить: Просмотрите код и замените $this на другую переменную замещения.

Вопросы, относящиеся:

  1. Вызов нестатический метод как статический: PHP Неустранимая ошибка: использование $ this, если не в объектном контексте
  2. Копировать код: Неустранимая ошибка: использование $ this, если не в объекте context
  3. Все «Использование $ this, если не в контексте объекта» Вопросы по Stackoverflow

36
задан nhahtdh 8 September 2012 в 23:04
поделиться

12 ответов

Я обычно вижу и использую или "AddCore" или "InnerAdd"

28
ответ дан TheSoftwareJedi 27 November 2019 в 05:16
поделиться

О, я забыл упоминать, почему я делаю это. Это - потому что это - простой способ создать обработку при помощи цикла для методов, которые я хотел бы назвать в последовательности. Например, если у меня есть некоторая проверка, которая должна быть сделана немного отличающаяся каждый раз, но методы использования с тем же классом. Я настроил их как

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
} 
0
ответ дан Carl McDade 9 October 2019 в 23:51
поделиться

Я встретился с этим соглашением много, к сожалению, наряду с тенденцией назвать средства управления на форме с начальным символом подчеркивания (например, "_txtFirstname" вместо просто "txtFirstname"). Это, кажется, странный bleedover эффект от no-longer-MS-recommended практики именования частных переменных с начальным символом подчеркивания. Это или программисты просто любит использовать ключ подчеркивания ни по какой причине, которую я могу выяснить.

не используют это соглашение, и когда Ваш коллега настаивает на нем, бросьте вызов ему находить что-то ( что-либо ) онлайн, который рекомендует эту практику.

0
ответ дан MusiGenesis 27 November 2019 в 05:16
поделиться

Будьте описательными с именами методов для создания кода, который объясняется, не должно быть никаких коллизий, потому что у Вас не должно быть двух методов, делающих точно то же самое, таким образом, у Вас не должно быть причины нуждаться в символе для добавления префикса имен методов.

Некоторые люди префикс частные поля с "m _", я не видел подобных стилей для закрытых методов.

0
ответ дан Paul 27 November 2019 в 05:16
поделиться

Я думаю с большинством соглашений на частном материале существует больше свободы. Однако я вижу это много:

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;
}

Также помещает те фигурные скобки в правильное пятно:-)

1
ответ дан Greg Dean 27 November 2019 в 05:16
поделиться

Я пошел бы для того, что мои предложенные товарищи по команде и делают это соглашение в команде. Но в особом случае похоже, что Вы могли избежать его:

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);
}

Или возможно я просто не должен идти ТАК это поздно...

1
ответ дан PEZ 27 November 2019 в 05:16
поделиться

Два изменения, которые я видел наиболее часто используемый, являются ими:

private Vector DoAdd(Vector vector) { ... }

и

private Vector AddImpl(Vector vector) { ... }

Никакой не является особенно удовлетворительным, но они - то, что я видел.

я никогда не видел соглашение, что ВСЕ закрытые методы должны иметь префикс - простая мысль о нем заставляет меня дрожать!

Это плохо достаточно имеет дело со всеми разработчиками C++, которые снабжают префиксом каждого участника в поле зрения "_" - и я говорю как бывший разработчик Дельфи, который раньше снабжал префиксом каждого участника "F". Я все еще восстанавливаюсь с этого!

5
ответ дан Bevan 27 November 2019 в 05:16
поделиться

Так как общественность Добавляет (), делает некоторые проверки, и частное не делает:

private Vector AddUnchecked(Vector vector) {
    for (int index = 0; index < Length; index++) {
        this[index] += vector[index];
    }
    return this;
}
6
ответ дан EricSchaefer 27 November 2019 в 05:16
поделиться

Лично, для методов, у меня есть то же соглашение о присвоении имен независимо от видимости.

Это мои соглашения о присвоении имен для C#:

  • Пространства имен, типы, методы, свойства: локальные переменные PascalCase
  • : Camel-регистр
  • Параметры к методам: Camel-регистр
  • поля Private: _PascalCase с префиксом подчеркивания, при поддержке поля для свойства, тогда то же имя как свойство только с префиксом подчеркивания

Редактирование : Отметьте, я виновен в использовании имен префикса закрытых методов. Я не поймал ту конкретную часть Вашего вопроса в первый раз, когда я считал его.

, Например, если у меня есть 7 различных способов выполнить мой SQL-оператор через мой класс DatabaseCommand, как QueryDataTable, QueryEnumerable, QueryEnumerable<T>, QueryDataReader, и т.д. тогда, все они хотят назвать те же закрытые методы, у меня есть тенденция назвать этот метод InternalQuery или PrivateQuery.

15
ответ дан Dmitry Gonchar 27 November 2019 в 05:16
поделиться

Я обычно использую 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;
}
26
ответ дан Andy May 27 November 2019 в 05:16
поделиться

Я никогда не видел соглашения кодирования в C#, который различал открытые и закрытые методы. Я не предлагаю делать его, так как я не вижу преимущества.

, Если имя метода конфликтует с открытыми методами, it’s время для становления более описательным; если, как в Вашем случае, это содержит фактический метод реализация для открытого метода, одно соглашение состоит в том, чтобы назвать его *Impl. Т.е. AddImpl в Вашем случае.

25
ответ дан Konrad Rudolph 27 November 2019 в 05:16
поделиться

Довольно распространено использовать начальный символ подчеркивания для частных собственностей, но я никогда не видел сделанный на методах

3
ответ дан cgreeno 27 November 2019 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: