Вам нужно найти, где создается экземпляр класса следующим образом:
$ivole_sender = new Ivole_Sender();
Таким образом, вы можете использовать эту переменную в действии удаления.
global $ivole_sender;
remove_action( 'woocommerce_order_status_completed_notification', array( $ivole_sender, 'sender_trigger' ), 10 );
Вот мой набор правил
Для полуофициального мнения, стоит взглянуть на руководящие принципы разработки структуры по этому вопросу:
В конце концов, это ДЕЙСТВИТЕЛЬНО не имеет значения. Используйте соглашение об именах, которое имеет смысл.
public class MyDictionary<T1, T2>
{ }
, вероятно, не так полезно, как
public class MyDictionary<KeyType, ValueType>
(или TKey, TValue, если вы предпочитаете).
Если я смотрю на вашу реализацию и должен думать «хорошо, что это снова «Т3»? тогда ты не сделал хорошую работу.
Пример от Microsoft:
public interface IDictionary<TKey, TValue>
Параметр type представляет что-то , поэтому, если вы хотите иметь читаемый код, это «что-то» должно быть очевидно из кода (без дополнительные комментарии). Использование имен типов, таких как T, V, U, не обязательно очевидно (но иногда это может быть).
Это зависит от того, насколько ценным является содержание сообщений. Семейство SHA явно более безопасно, чем MD5 (где «более безопасный» означает «сложнее подделать»), но если ваши сообщения являются обновлениями в Твиттере, то вам, вероятно, все равно.
Есть несколько вещей, которые, я думаю, вам следует принять во внимание:
В общем, я всегда ставлю перед аргументами типа T
и делаю они «достаточно информативны», то есть настолько информативны, насколько они должны быть для меня, чтобы понять, что они делают и / или что от них требуется, когда я смотрю на код через шесть месяцев.
Пара примеров , на мой взгляд, хорошего именования аргументов типа (нумерация в этом списке не зависит от нумерации выше ...):
Один аргумент, и это очевидно из имени класса (или в противном случае из контекста в коде) почему необходимо имя типа:
List
Поскольку мы видим, что это список объектов типа T
, и нет никаких конкретных ограничений на T
, нет необходимости давать более конкретное имя аргументу типа.
Несколько аргументов, которые представляют разные вещи в универсальном классе / интерфейсе:
IDictionary
Нам нужно иметь возможность различать два аргумента, поэтому мы не t указать тип ключа для значения и наоборот.Таким образом, наименование аргументов Ключ
и Значение
и префикс T
кажется уместным.
Я должен подчеркнуть, что это намного лучше, чем, например, IDictionary
или IDictionary
, поскольку в В последних двух случаях невозможно интуитивно узнать, какой аргумент для чего будет использоваться.
Один аргумент типа, но тип должен удовлетворять тем или иным требованиям:
Репозиторий , где TEntity: class, IEntity
Поскольку мы требуем, чтобы тип реализовывал другой интерфейс, он делает имеет смысл предупредить программиста, что это так. Выберите информативное имя, которое поможет вам увидеть, что требуется от типа, и добавьте к нему префикс T
.