I have done a lot of research on OOP and I keep seeming to read different opinions on several items, especially the scope resolution operator (::) and handling class containing private functions.
When calling a private function from within the class it seems that a majority of programmers recommend self::method(), is this accurate? I have also seen and tested Class::method().
Also, I am looking for more information, or recommendations on appropriate ways to instantiate class variables, whether it be protected, private, var, etc...
Take this Timer class I wrote for example:
class Timer {
    protected $_start, $_pause, $_stop, $_elapsed;
    protected $_laps = array();
    protected $_count = 1;
    protected $_lapTotalTime = 0;
    public function __construct($start = '') {
        $start = strtolower($start);
        ($start === 'start') ? self::start() : NULL;
    }
    public function start( ) {
        $this->_start = Timer::getMicroTime();
    }
    public function stop( ) {
        $this->_stop = Timer::getMicroTime();
    }
    public function pause( ) {
        $this->_pause = Timer::getMicroTime();
        $this->_elapsed += ($this->_pause - $this->_start);
    }
    public function resume( ) {
        $this->_start = Timer::getMicroTime();
    }
    // Used to build an array of times for multiple timers
    public function lap($key = '') {
        ($key === '') ? $key = 'Lap' : $key = $key;
        if (isset($this->_start)) {
            self::stop();
            $this->_lapTotalTime += ($this->_stop - $this->_start);
            $this->_laps[$key.' '.$this->_count] = self::getLapTime();
            self::start();
            $this->_count++;
        }
    }
    public function getTime() {
        if (!isset($this->_stop)) {
            $this->_stop = Timer::getMicroTime();
        }
        if (!empty($this->_laps)) {
            $this->_laps['Total'] = self::timeToString($this->_lapTotalTime);
            return $this->_laps;
        }
        return self::timeToString();
    }
    // PRIVATE CLASS FUNCTIONS
    private function getLapTime() {
        return self::timeToString();
    }
    private function getMicroTime( ) {
        list($usec, $sec) = explode(' ', microtime());
        return ((float) $usec + (float) $sec);
    }
    private function timeToString($seconds = '') {
        if ($seconds === '') {
            $seconds = ($this->_stop - $this->_start) + $this->_elapsed;
        }
        $seconds = Timer::roundMicroTime($seconds);
        $hours = floor($seconds / (60 * 60));
        $divisor_for_minutes = $seconds % (60 * 60);
        $minutes = floor($divisor_for_minutes / 60);
        return $hours . "h:" . $minutes . "m:" . $seconds . "s";
    }
    private function roundMicroTime($microTime) {
        return round($microTime, 4, PHP_ROUND_HALF_UP);
    }
}
All of my instantiated variables are declared as protected. My reasoning, if I am understanding correctly is because although this Class doesn't extend another class, the other class may extend Timer. Am I on the right track?
Example of Timer use with laps:
$t = new Timer('start');
usleep(3215789);
// Declare a key for the lap array
$t->lap('Sleep');
usleep(4445666);
// No key declaration
$t->lap();
usleep(1000000);
echo "<pre>";
if (is_array($t->getTime())) { 
    print_r($t->getTime()); 
} else { 
    echo $t->getTime();
}
echo "</pre>";
Output:
Array ( [Sleep 1] => 0h:0m:3.2154s [Lap 2] => 0h:0m:4.4462s [Total] => 0h:0m:7.6616s )
Without laps:
$t = new Timer('start');
usleep(3215789);
usleep(1000000);
echo "<pre>";
if (is_array($t->getTime())) { 
    print_r($t->getTime()); 
} else { 
    echo $t->getTime();
}
echo "</pre>";
Output:
0h:0m:4.2158s

::operator, orT_PAAMAYIM_NEKUDOTAYIMif you like that, is an operator for static methods and class constants, to call a method use$this->method(). \$\endgroup\$