SICP练习2.1

[sourcecode language=”plain”]
#lang racket
(define (make-rat n d)
(cond ((> (* n d) 0)
(let (
(n (abs n))
(d (abs d))
)
(let ((g (gcd n d)))(cons (/ n g)(/ d g)))))
((< (* n d) 0)
(let (
(n (- 0 (abs n)))
(d (abs d))
)
(let ((g (gcd n d)))(cons (/ n g)(/ d g)))))))
(define (number x)(car x))
(define (denom x)(cdr x))
(define (gcd a b)
(if (= b 0)
a
(gcd b (remainder a b))))
[/sourcecode]

PHP单例模式

网上很多讲php单例模式的帖子,但是每个人讲的都会有差异。

要了解一个概念,我觉得首先要先看下官方的文档,如果官方文档里没有的再去搜索其他资料,比如这个单例模式,php官方文档里讲的又简单又清楚

这里贴一下phpdoc里的介绍

单例模式(Singleton)用于为一个类生成一个唯一的对象。最常用的地方是数据库连接。 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。

 

Example #2 单例模式

<?php
class Example
{
    
// 保存类实例在此属性中
    
private static $instance;
    
       
// 构造方法声明为private,防止直接创建对象
    
private function __construct() 
    {
        echo 
'I am constructed';
    }

    // singleton 方法
    
public static function singleton() 
    {
        if (!isset(
self::$instance)) {
            
$c __CLASS__;
            
self::$instance = new $c;
        }

        return self::$instance;
    }
    
    
// Example类中的普通方法
    
public function bark()
    {
        echo 
'Woof!';
    }

    // 阻止用户复制对象实例
    
public function __clone()
    {
        
trigger_error('Clone is not allowed.'E_USER_ERROR);
    }

}

?>

这样我们可以得到一个独一无二的Example类的对象。

<?php

// 这个写法会出错,因为构造方法被声明为private
$test = new Example;

// 下面将得到Example类的单例对象
$test Example::singleton();
$test->bark();

// 复制对象将导致一个E_USER_ERROR.
$test_clone = clone $test;

?>

Continue reading PHP单例模式