Собственно хотелось бы увидеть различие работы со static:: от parent:: и self::
Ответ parent - вызываем родительский метод (не обязательно статичный), self - вызываем метод именно этого класса, static - вызываем метод текущего класса. Разница между self и static хорошо видна, например, когда вы делаете new self() или new static() - в первом случае будет создан объект класса, где упомянут self (т.е. создан родитель), во втором - объект того класса, где вызывается метод (т.е. потомок) примеры можно посмотреть здесь. "когда применять" - всегда, если только вам не нужен именно текущий класс, а не его наследники. Не знаю когда это может понадобиться, поэтому можете использовать static всегда, потом меньше проблем будет ) в документации можно почитать эту статью, там как раз описано отличие static и self и прочее (ответ перенесён из комментариев BOPOH)