I think I can explain why you got confused with this and how you can understand it. The root of this confusing topic lies in the use of the “static” keyword, and we’re carrying this confusion since C++ introduced its use as an indicator that a member of a class definition belongs to the class rather than to the objects of that class. I’m not sure why “static” was used, but probably it was done so to avoid adding a new keyword to the language (“static” actually means something different in C).

Let’s explain this in Layman’s terms:

Using “static” inside a class doesn’t mean “static”, it means “this belongs to the class, not to the objects”

This use of “static” leads to further confusion, when you invoke a “static” method you aren’t “statically calling a method”, you’re just calling a method in the scope of a class. This also applies to “non-static” methods, you aren’t “dinamically calling a method”, you’re just calling a method in the scope of an object. The key point here is scope resolution, if you’re already in the scope of an object you can do either $this->foo() or self::foo() and expect the exact same result.

“Statically calling” and “dinamycally calling” actually mean something else. The key difference between a “static invocation” and a “dynamic invocation” is when the target of the invocation is resolved. In a static invocation the target is resolved during compilation, in a dynamic invocation the target is resolved in runtime.

In Layman’s terms:

Static call means “we know for sure who will receive this call when the program is ran”.

Dynamic call mean “we’ll find out who will receive this call when the program is ran”

And please not that in a dynamic language such as php all invocations are dynamic.