Well; it's not so much a difference between strong and weak typing, as between static and dynamic typing.
Statically-typed languages like Java or C# won't allow you to store an integer value in a string variable, while dynamically-typed languages like PHP or Python will.
The strong/weak difference is that the former will choke if you try and use an integer in a string context (e.g., Python will throw a TypeError exception), while the latter will try and cope (e.g., PHP will do the cast). So in a dynamically typed language, you're still left with the job of checking types at run time.
But how much of that type checking do you really need? If you have a function foo($i) that accepts an integer, do you want to forbid calling foo('42')?
If I do need type-validation (or type-coercion), I give the class in question a suitable set of methods that return void on success or throw an exception on error. Only public methods need protection like that, of course, and they tend to reduce to a set of validation checks followed by a call to the real method. It's also here that I mimic function overloading (though function overloading could be regarded as mimicking dynamic typing)...