Book of good explanations
1. Static/Dynamic vs Strong/Weak typing
Simply put it this way: in a statically typed language the type is static, meaning once you
set a variable to a type, you CANNOT change it. That is because typing is associated
with the variable rather than the value it refers to.
For example in Java:
String str = "Hello"; //statically typed as string
str = 5; //would throw an error since java is statically typed
Whereas in a dynamically typed language the type is dynamic, meaning after you set a
variable to a type, you CAN change it. That is because typing is associated with the
value rather than the variable.
For example in Python:
str = "Hello" # it is a string
str = 5 # now it is an integer; perfectly OK
On the other hand, the strong/weak typing in a language is related to implicit type
conversions (partly taken from @Dario's answer):
For example in Python:
str = 5 + "hello"
# would throw an error since it does not want to cast one type to the other
implicitly.
whereas in PHP:
$str = 5 + "hello"; // equals 5 because "hello" is implicitly casted to 0
// PHP is weakly typed, thus is a very forgiving language.
Static typing allows for checking type correctness at compile time. Statically typed
languages are usually compiled, and dynamically typed languages are interpreted.
Therefore, dynamicly typed languages can check typing at run time.