In other words, how can I know that a client programmer never needs to redefine a method?
You can not. And you do not need. It is not your job to foresee that a developer might want to override a method, not to mention how to do it. Just suppose he wants and allows him to do this without touching your code. And for this reason, do not declare private methods unless you need to.
If a developer feels that he needs to configure some functions of your classes, he can choose from a number of structural and behavioral models to do this, for example. Decorators, adapters, or subclasses. Using these templates is good because it encapsulates the changes in the developer’s own class and does not leave your own code unaffected. By declaring private methods, you will ensure that the developer will be monkey with your class. And that's bad.
A great example is the DB Zend Framework adapter. They prevent the use of persistent connections, and their adapters do not provide any value for this purpose. But what if you want to have this, however, and the adapter method was marked private (it is not, but what if)? Since there is no way to overwrite a method, you would (yes, you would) change the adapter code directly inside the class or copy and paste the code into your own adapter class, effectively duplicating 99% of the class just for changing one function call. Whenever there is an update for this adapter, you will either lose your changes or not get it (in case you are c & p'd). If it were marked as protected (as is), you could just write a subclass of pConnectAdapter.
Also, when subclassing, you actually say that subClass is parentClass. Thus, you can expect the derived class to have the same functions as parentClass. If the parent class has functionality that should not be available in the subclass, then disabling it will conceptually relate to the subclass.
That's why I find it much better to use all the default methods and properties for protected visibility and to mark only those methods (though not properties) that allow interacting with my class from another class or script as public , but only a few things private . Thus, I give the developer the opportunity to use my class, as I expected, to use it, and the ability to configure it. And if he breaks something in this process, it is most likely his fault, not mine.
Update: since I wrote this four years ago, I came to the conclusion that default for protected rather than private often leads to suboptimal subclasses. This is because people will start using everything that you provide as protected. This, in turn, means that you must treat all of these methods as APIs and cannot modify them as you see fit. Therefore, it’s best to carefully consider which extension points you want to provide, and keep everything else private. See http://fabien.potencier.org/article/47/pragmatism-over-theory-protected-vs-private for a similar presentation.