PHP 自动加载对象

如果定了很多类文件,在使用的时候常用的方法就是在文件包含这些类文件,但是如果类文件太多则是一个比较烦的事情,包含文件可能会写一坨

这里说一种常用的自动加载的方法

比如我们先定义一个类,文件名 a.php

[code lang=”php”]
<?php
class A{
private $var;

public function getVar()
{
return $this->var;
}

public function setVar($value=”)
{
$this->var = $value;
}
}
?>
[/code]
再定义另一个类文件c.php
[code lang=”php”]
<?php
class C{
function __toString(){
return "this is class C";
}
}
[/code]
然后在我们在 b.php 里使用自动加载方法
[code lang=”php”]
<?php
//先定义一个自动加载的function
function _autoload($class=”)
{
//简单演示,写的较简单
include_once(strtolower($class).".php");
}
//然后将函数注册到SPL __autoload函数栈中
spl_autoload_register(‘_autoload’);
$b = new A();
$b->setVar("have fun");
echo $b->getVar();//have fun

$b = new C();
echo $b;//this is a class C
[/code]

自动加载函数的名字是可以换的,比如

[code lang=”php”]
<?php
function example($class=”)
{
include_once(strtolower($class).".php");
}
spl_autoload_register(‘example’);
$b = new A();
$b->setVar("have a fun");
echo $b->getVar();//have a fun

$b = new C();
echo $b;//this is a class C
[/code]

文档里都有介绍,偶没深入写,若拍请轻拍

SICP练习2.21-2.22

[code lang=”lisp”]
#lang racket
;;;(square-list (list 1 2 3 4))
;;;'( 1 2 3 16)

;;;Racket not support nil
(define nil ‘())
;;;the map define have given
(define (map proc items)
(if (null? items)
nil
(cons (proc (car items))
(map proc (cdr items)))))
(define (square x)(* x x))
;;;2.21
(define (square-list items)
(if (null? items)
nil
(cons (square (car items))
(square-list (cdr items)))))
(define (square-list2 items)
(map (lambda (x) (square x)) items))
;;; 2.22
;;;刚开始的定义
;;;(cons (square (car things) answer))先被处理的元素会被放到后面
;;;后来的定义的问题是cons 的第一个参数是list 第二个参数却是整数
;;;会得到一个比较奇怪的结果,比如
;;;> (square-list (list 1 2 3 4 5))
;;;(((((() . 1) . 4) . 9) . 16) . 25)
;;;正确的定义是
(define (square-list3 items)
(define (iter things answer)
(if (null? things)
answer
(iter (cdr things)
(append answer
(list (square (car things)))))))
(iter items null))
[/code]

一个javascript题目

前几天在QQ群里abcd(他的微博)同学出了一个题目,挺有意思,这里贴一下

[code lang=”js”]
var a = 1;
var b = {
a: 2,
b: function() {
alert(this.a);
}(),
f: this.f = function() {
alert(this.a);
}
};
function f() {
alert(3);
}
f();
b.f();
(b.f)();
(0, b.f)();
[/code]

结果是五次alert输出 1  1  2  2  1

你答对了吗?知道为什么吗?……假装自己有读者%>_<%

SICP练习2.13

直接翻译一下其他人的答案好了,我堕落了,原文http://community.schemewiki.org/?sicp-ex-2.13

先不管scheme ,我们先用数学推导一下这个所谓的简单公式:

先假设Ca 是区间a的中间值,Ta是a的百分误差值

a = [Ca*(1-0.5*Ta),Ca*(1+0.5*Ta)]

同上

b = [Cb*(1-0.5*Tb),Cb*(1+0.5*Tb)]

如果所有区间值为正,a*b 的值是

a*b = [Ca*Cb*(1 - 0.5*(Ta + Tb) + 0.25*Ta*Tb),
         Ca*Cb*(1 + 0.5*(Ta + Tb) + 0.25*Ta*Tb)]
 因为Ta*Tb 是一个很小的值,所以可被忽略。所以误差很小的区间的乘积的误差可以看着是乘积双方的误差的和
下面用代码验证下:

[code lang=”lisp”]
;;;之前的一些定义
(define (make-interval a b) (cons a b))
(define (upper-bound interval) (max (car interval) (cdr interval)))
(define (lower-bound interval) (min (car interval) (cdr interval)))
(define (center i) (/ (+ (upper-bound i) (lower-bound i)) 2))

;;;误差百分比是在0和100之间
;;;按照之前数学推导的来定义
(define (make-interval-center-percent c pct)
(let ((width (* c (/ pct 100.0))))
(make-interval (- c width) (+ c width))))
;;;之前的老方法来定义
(define (percent-tolerance i)
(let ((center (/ (+ (upper-bound i) (lower-bound i)) 2.0))
(width (/ (- (upper-bound i) (lower-bound i)) 2.0)))
(* (/ width center) 100)))

(define (mul-interval x y)
(let ((p1 (* (lower-bound x) (lower-bound y)))
(p2 (* (lower-bound x) (upper-bound y)))
(p3 (* (upper-bound x) (lower-bound y)))
(p4 (* (upper-bound x) (upper-bound y))))
(make-interval (min p1 p2 p3 p4)
(max p1 p2 p3 p4))))

;;;对比两者的得到的值
(define i (make-interval-center-percent 10 0.5))
(define j (make-interval-center-percent 10 0.4))
(percent-tolerance (mul-interval i j))

;;; 得到的值 0.89998, 很接近 (0.5 + 0.4).
[/code]

JavaScript concat() 方法

定义和用法

concat() 方法用于连接两个或多个数组。

该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。

语法

arrayObject.concat(arrayX,arrayX,......,arrayX)

下面用利用concat写个快速排序

[code lang=”js”]
function qsort(arr){
if(arr.length<=1){
return arr;
}
var pivot = Math.floor(arr.length/2);
var pivotItem = arr.splice(pivot,1);
var left = [], right= [];
for(var i in arr){
if(arr[i]<pivotItem){
left.push(arr[i]);
}else{
right.push(arr[i]);
}
}
left = arguments.callee(left);
right = arguments.callee(right);
return left.concat(pivotItem,right);
}
//example
var b = [1,4,2,9,7,5];
b = qsort(b);
console.log(b);//[1,2,4,5,7,9]
[/code]

Javascript 单例模式

内容非原创,纯笔记

单例模式一般是为了防止一个对象(类)被多次实例化所采用的一种手段,也就是说只有一个实例的,比如php中也会有单例模式 PHP单例模式

在javascript中,是以对象字面量的方式来创建单例对象的,也就是以花括号包裹起来的键值对的JSON形式来创建的。

ex:

[code lang=”js”]
var single_ex ={
name:’jim’,
dosomething:function(){

}
}
[/code]

 模块模式则是用来为单例创建私有变量和特权方法(公有方法),从而能增强单例的可访问性。以模块模式定义的私有变量和私有函数只有单例对象本身的特权(公有)方法可以访问到,其他外部的任何对象都不可以。

下面写一个简单的dragdrop 效果的代码 用到了单例模式

[code lang=”js”]
<div class="draggable" style="position:absolute;width:200px;height:200px;"></div>
<script type="text/javascript">
var DrogDrop = function(){
var dragging = null;
var diffX = 0;
var diffY = 0;
function handleEvent(event){
var target = event.target;
switch(event.type){
case ‘mousedown’:
console.log(target);
if(target.className.indexOf("draggable") > -1){
dragging = target;
}
diffX = event.clientX – target.offsetLeft;
diffY = event.clientY – target.offsetTop;

break;
case ‘mousemove’:
if(dragging!=null){
dragging.style.left = (event.clientX – diffX) + ‘px’;
dragging.style.top = (event.clientY -diffY) + ‘px’;
}
break;
case ‘mouseup’:
dragging = null;
break;
}
}

return {
enable:function(){
document.addEventListener(‘mousedown’,handleEvent,false);
document.addEventListener(‘mousemove’,handleEvent,false);
document.addEventListener(‘mouseup’,handleEvent,false);
},
disable:function(){
document.removeEventListener(‘mousedown’,handleEvent,false);
document.removeEventListener(‘mousemove’,handleEvent,false);
document.removeEventListener(‘mouseip’,handleEvent,false);
}
}

}();
DrogDrop.enable();
</script>
[/code]

SICP练习2.10

如果一个区间upper lower 乘积小于等于0,说明是跨过0的区间
[sourcecode]
(define (div-interval x y)
(if (>= 0 (* (lower-bound y) (upper-bound y)))
(error "Division error (interval spans 0)" y)
(mul-interval x
(make-interval (/ 1.0 (upper-bound y))
(/ 1.0 (lower-bound y))))))
[/sourcecode]