M1 isn't perfect because you have a concrete reference to a class in the method itself, and so you're correct in that you won't be able to mock it. In this situation you should use dependency injection to pass an object reference to the method.
M2 is pretty much the same situation, in that it's using a concrete reference, but as you pointed out, it's using a static method instead. Static methods are difficult to mock because there's no way to create an interface that defines static methods (I'm speaking from a .Net background, I'm not sure whether you can interface static methods in PHP, but I doubt it).
M3, looks like you're using property injection, in which case yes, this is an easily mockable test, because the object is instantiated outside of the class itself and passed to it.
M4 is the same as M3 because the dependency injection comes in the form of a method parameter.
Ideally dependency injection should be done at class level, either by using properties or constructor parameters. Constructor parameters are generally viewed as the preferred method, because property injection, at least from my perspective, is a little loose, whereas constructor injection forces you to create a class with every dependency it requires.