Disclaimer: In no way does this example advocate the use of singletons. Singletons are to be used with a lot of care.
In PHP there is quite a standard way of implementing a singleton:
public class Singleton {
    private $instance;
    private function __construct() { };
    public function getInstance() {
        if (!self::$instance) {
            // new self() is 'basically' equivalent to new Singleton()
            self::$instance = new self();
        }
        return self::$instance;
    }
    // Prevent cloning of the instance
    protected function __clone() { }
    // Prevent serialization of the instance
    protected function __sleep() { }
    // Prevent deserialization of the instance
    protected function __wakeup() { }
}
To prevent code duplication, it is a good idea to extract this behaviour into a trait.
trait SingletonTrait {
    private $instance;
    protected function __construct() { };
    public function getInstance() {
        if (!self::$instance) {
            // new self() will refer to the class that uses the trait
            self::$instance = new self();
        }
        return self::$instance;
    }
    protected function __clone() { }
    protected function __sleep() { }
    protected function __wakeup() { }
}
Now any class that wants to function as a singleton can simply use the trait:
class MyClass {
    use SingletonTrait;
}
// Error! Constructor is not publicly accessible
$myClass = new MyClass();
$myClass = MyClass::getInstance();
// All calls below will fail due to method visibility
$myClassCopy = clone $myClass; // Error!
$serializedMyClass = serialize($myClass); // Error!
$myClass = deserialize($serializedMyclass); // Error!
Even though it is now impossible to serialize a singleton, it is still useful to also disallow the deserialize method.