When the code starts to get (really) complex, it gets hard to keep track of errors coming up. In a compiled, statically typed language the extra nagging from the compiler really really pays off, as you know EXACTLY what the problem is and where to expect one. Then the debugging really comes down to hunting nulls and what-if scenarios. In PHP you basically have to keep track of almost everything having the right type etc.
I grew up as a Java person (even got meself the SCJP) and I then had to cope with PHP on my work enviroment. I came to appreciate how you can do a lot of things really quickly, but now I spend my time hunting for errors that start appearing once the code passes a certain level of complexity (even though I did take care to design things in a proper OO manner). It's simply hard to keep track of things.
Object orientation kinda sucks in PHP, btw and I have yet to come up with a viable solution to the "include" mess. In Java you have your packages and subpackages in specific folders. You add the right dir in the classpath and you're sorted. In PHP... most things are relevant to the location of the entry file. And packages... basically don't exist.
Coming to which... I'm now trying to squeeze my way into J2EE... it's the "right" way for anything large scale but it's a bit daunting to begin with. And that's what's kept me so far from delving into it.
Then I hear a lot of good things about the ZK framework, which I'm currently looking into and it seems quite promising. So, from what I've seen so far it looks like a technology well worth investing into.