When you declare a function like this:
testfunction($param1, $param2, $param3, $param4=NULL) {
//do stuff
}
You're telling PHP that $param4 already has a value, so when that function is called, a value is already assigned to it. It doesn't expect you to send an argument for that parameter because a default one has already been assigned.
It therefore knows the function will be able to operate (to a certain extent) as it should. It's useful for making optional parameters.
However when you declare a function as this:
testfunction($param1, $param2, $param3, $param4) {
//do stuff
}
PHP Expects you to send through that argument ($param4), because without it, the function won't be able to accomplish what you've set it out to do, at least so PHP assumes, because you would never create a function with 4 parameters where not one of them are used in the function body.
Make sense?