Вы можете добавить еще один strtotime
, чтобы получить желаемый результат
$payroll['month'] = "2019-03";
echo $payroll['month'];
echo $newdate = date("Y-m", strtotime("-1 months", strtotime($payroll['month'])));
Еще один способ сделать то же самое:
date('Y-m', strtotime($payroll['month'] . '-1 months'))
Это также будет работать для вас. [ 115]
Я считаю этот комментарий очень полезным, поскольку он указывает на две важные вещи:
Это заставляет меня спросить себя, является ли метод вопрос должен быть частью типа или нет. Так как он не использует любой экземпляр данных, вы должны в хотя бы подумайте, можно ли его переместить в своем роде. Это неотъемлемая часть типа, или это действительно общее метод полезности цели? 1260 Если есть смысл сохранить метод на конкретный тип, есть потенциальный прирост производительности как компилятор будет выдавать другой код для статического метода.
Из документации FxCop для того же предупреждения (выделение добавлено):
«Члены, которые не обращаются к данным экземпляра или не вызывают методы экземпляра, могут быть помечены как статические (Shared в Visual Basic). После того, как вы пометите методы как статические, компилятор будет отправлять не виртуальные сайты вызовов этим участникам. Создание не виртуальных сайтов вызовов будет препятствовать проверке во время выполнения для каждого вызова, которая гарантирует, что текущий указатель объекта не равен нулю. Это может привести к ощутимому увеличению производительности для чувствительного к производительности кода. В некоторых случаях невозможность доступа к текущему экземпляру объекта представляет проблему правильности. "
Очень хорошая дискуссия на эту тему здесь (SO) . Я нахожусь в лагере, если это может быть сделано статичным, сделать это статическим. Я верю в это из-за понятия, почему можно использовать метод экземпляра, который не использует никаких данных экземпляра. Это действительно метод экземпляра в этом случае или метод класса?
Нет необходимости создавать (ноль) экземпляры класса для использования метода, если он объявлен как статический ... который сохраняет циклы процессора, необходимые для обработки конструкции, пространства кучи и циклов процессора сборщиком мусора при извлечении объекта из кучи ...
Кроме того, ваш вопрос, как он написан
"... создается только один экземпляр статического метода (для типа) ... «
подразумевает, что для метода экземпляра код метода повторяется для каждого экземпляра создаваемого класса. Это неправда. Независимо от того, сколько экземпляров вы создаете для любого типа, код для методов загружается в память только один раз. Объект, сохраняемый в куче для каждого экземпляра, хранит только «State» типа (нестатические поля и несколько переменных отслеживания misc).
Вам не нужно помещать «this» в стек функции для статического метода. Это еще одна причина, по которой он дешевле.
Для меня , самое большое преимущество этого совета ReSharper (вы можете установить его как предупреждение, предложение, или намек). Разве это побуждает меня сделать как можно больше статических методов? Это хорошо, так как статический метод не имеет прямой зависимости от класса, членом которого он является. Это означает, что его можно легко переместить в другой класс в качестве статического члена.
Еще один изящный прием со статикой в ReSharper - сделать набор связанных методов статическим с помощью рефакторинга «Make Method Static». Это переместит некоторые зависимости в параметры метода. Когда вы посмотрите на этот набор методов позже, вы можете обнаружить, что все они обращаются к определенному объекту определенного типа. Затем вы можете использовать рефакторинг «Make method non-static» и указать этот объект как новый указатель this . Это перемещает ваш метод в другой класс.
От этого:
internal class ClassA
{
public ClassB Property { get; set; }
public int Method()
{
var classB = Property;
return classB.Property1 + classB.Property2;
}
}
internal class ClassB
{
public int Property1 { get; set; }
public int Property2 { get; set; }
}
до этого:
public static int Method(ClassB property)
{
var classB = property;
return classB.Property1 + classB.Property2;
}
до этого:
internal class ClassA
{
public ClassB Property { get; set; }
}
internal class ClassB
{
public int Property1 { get; set; }
public int Property2 { get; set; }
public int Method()
{
return Property1 + Property2;
}
}