With what you have actually written (modulo the typo I called out) you should never see the values of $ntp::params::var_03 or $ntp::params::var_04 not yet defined in ntp::install. However, small changes in your manifests or in the starting manifest you apply could make a difference. For example, reversing the order of the 'include' calls in class ntp would result in the variables not yet being defined when class ntp::install is evaluated (when starting by evaluating class 'ntp'). Either way, starting the evaluation at class 'ntp::install' will result in none of those variables having been defined.
There are really two different cases here:
Case 1: Since class 'ntp::install' depends on variables of class 'ntp::params', it is wise for 'ntp::install' to start by 'include'ing 'ntp::params'. It is safe for both 'ntp' and 'ntp::install' to do that. If that is done then class 'ntp::install' will always see initialized values for the variables of class 'ntp::params'; otherwise, it relies on 'ntp::params' to have been evaluated at some other class's direction before 'ntp::install' is evaluated.
Case 2: The variables of class 'ntp' are different because class 'ntp::install' is declared by class 'ntp'. It is unwise, and may not do as you expect, for class 'ntp::install' to create an evaluation-dependency loop by declaring class 'ntp'. Puppet would not loop infinitely, but you could get unexpected results. If 'ntp::install' must depend on variables (including class parameters) of class 'ntp', and class 'ntp' must declare class 'ntp::install', then the only good solution is to document that class 'ntp::install' is an internal class that must not be applied directly or declared by classes outside its module.
Inside the module, it probably should be declared only by class 'ntp', but another class that can be certain that class 'ntp' has already been evaluated could conceivably declare 'ntp::install', too.
With that said, if you want all the gory details then I don't know any better explanation than
Henrik's.
John