Editing the file directly on the server with vi showed that the file was fine, but we would get "Premature end of file" errors when trying to open the file via WebDAV. We quickly ruled out all the obvious candidates like file or directory permissions, and were forced to the conclusion that something about the file itself was causing the problem. That's a pretty odd problem for a file server to have. Curious. For fun, I opened the file in vi on the client side, but that showed the file as empty! So that ruled out anything odd with BBEdit or virtually anything on the client side.
A quick tcpdump session showed that the file Content-length was being reported as zero. That explained the "end of file" error, but why would WebDAV arbitrarily set the content length to zero when the file clearly had bytes in it? Other PHP files in the same directory worked just fine. Curiouser and curiouser. On a lark, I checked the server error_log (I know it should have been one of the first things I did), and noticed that we were getting PHP warnings! So mod_php was trying to handle the file -- not something a file server ought to be doing.
Checking the Apache config files, I realized that PHP had been enabled globally, not just in a specific content directory. We have several different content directories where we use PHP, and I didn't want to have to turn on PHP in each of them. So I just added a RemoveType .php line to the WebDAV directory config, effectively turning off PHP handling within the WebDAV root directory. This resolved the problem.
I realize this is a pretty specific hint, but I suspect there are other people out there having similar problems. I still have no idea why it was working fine with some PHP files and not others. If PHP were trying to operate on the files at all, I would have guessed it would have served up the results of the PHP execution, not the file contents itself. So that part's still a mystery. But recognizing that PHP was even involved at all was the turning point for me, and disabling it within the WebDAV directory certainly cured the problem. By the way, our server was Linux, not Mac OS X, but since it's Apache on *nix, it's all the same animal.

