Multiple object instantiation prevention
Using the check if (!$this-&gt;SessionCustomer) is not unusual even if a bit clunky. I would still be more explicit about it and use if ($this-&gt;SessionCustomer === null). The private $SessionCustomer; member will be initiated to null.

More generally however, what you are using here is called an anti-pattern. PHP Singletons are almost universally considered an anti-pattern. Singleton really is not something you should be using, as it's really unnecessary, what you really want is Dependency Injection.

When you want to use a single class instance during the lifetime of an object, you simply request the \Session\Customer type in your object's constructor, and use a Dependency Injection Container to make sure that the same instance is passed to all the instances of the JobController class:

class JobController
{
    private $sessionCustomer;
    public function __construct(\Session\Customer $sessionCustomer)
    {
        $this-&gt;sessionCustomer = $sessionCustomer;
    }
    public function saveJobAction()
    {
        // just use the private property
        if (empty($this-&gt;sessionCustomer-&gt;offsetGet('customer_id'))) {
            // do stuff
        }
    }
}


At this point, I would just like to comment that otherwise, there is really no reason to use OOP if you are not using constructor injection and just globally access things with a service locator (which is also a very bad pattern of its own, but that's for another topic). That code could be procedural.

Back to the topic: defining your requirements in the constructor allows for the calling code to decide that instance to pass to the JobController's constructor, reuse that instance, pass in a mock instance (because hopefully, you would be testing that class, which may necessitate for you to mock instances).

I generally use Auryn as a Dependency Injection Container, but the usage generally consists on instructing a container to share an instance of a class:

$injector = new \Auryn\Injector;
// this is how you actually use a single instance of a class, through sharing it with a container
$injector-&gt;share($sessionCustomer);
$jobController = $injector-&gt;make('JobController'); // uses the shared instance