一,类

二,对象

三,重载

四,接口

五,命名空间


一,类:
    $this:一个调用对象。通常是方法所属的对象,但也可以是另一个对象---如果该方法是从第二个对象内静态调用的话

    class A{
        function ATst(){
            echo get_class($this);
        }
    }
    class B{
        function BTst(){
            A::ATst()://静态调用
        }
    }
    $b=new B();
    echo $b->BTst();//输出B,但有提示

    self:$this->property只适用于成员属性或成员方法,对于静态属性或静态方法,用self::$property引用;
    extends:PHP只能单一继承。被继承的方法和成员可以以同样的名字重新声明被覆盖,除非在父类定义时使用final关键字。parent::访问父类中被覆盖的方法和成员;
    属性和方法:在没有访问限制修饰时,默认为public。跟heredocs不同,nowdocs可以使用在静态变量和静态声明中;
    访问实例方法和属性:类内部:$this->name,类外部:$objName->name;
    访问静态方法和属性:类内部:slf::$name,类外部:className::$name;
    const:定义类常量。在定义和使用时不需要使用$符号。访问方式:类内部:slf::name,类外部:className::name或$objName::name,不能通过->引用常量;
    自动加载:__autoload($className),在试图使用尚未被定义的类时自动调用;
    构造函数:__construct,在没有__construct函数时,PHP将寻找与类同名的函数作为构造函数,以此向下兼容。子类构造函数不会隐式调用父类的构造函数,需要在子类构造函数中调用parent::__construct();
    析构函数:__destruct()。与__construct一样,父类析构函数不会在子类中默认执行,必须在子类中显示调用parent::__destruct()。即使在exit()终止脚本运行时也会调用析构函数,但析构函数总调用exit()将终止其余关闭操作的执行。视图在析构函数中抛出异常将出现一个致命性错误;
    抽象类:abstract calss。只要类中自少有一个方法为抽象方法,该类必须声明为抽象方法;
    接口:interface。用implements实现接口。接口中的方法必须为public。实现多接口时,用逗号分割各接口名称。接口继承接口时用extends;
    trait:相对于继承而言,是一种轻量级的方法复用,提供并行的组合方式;
        trait,父类和当前类中的重名方法的解决方案:当前方法覆盖trait中的同名方法,trait覆盖父类中的同名方法;
        trait支持虚函数,在引入含有虚函数的trait的类必须实现trait中所有的虚函数;
        trait方法中可以使用静态变量,但trait不能定义静态变量,可以定义静态方法和非静态变量。对于trait中所定义的变量,在引用该trait的类中不可定义同名属性,当定义同名属性切值也相同时,产生一个E_STRICT,值不同时将产生致命性错误;
        trait的引入:类通过use关键字引入trait。同一个类中可以同时引入多个trait,各个trait间用逗号隔开;
        同一个类中所引入的不同trait中有同名方法,可以使用insteadof和as两个关键字解决。若不解决将产生致命性错误;
            insteadof:代替另一个trait中的同名函数;
            as:重命名trait中函数名称;

        trait A{
                public function smallTalk(){
                    echo 'a';
                }

                public function bigTalk(){
                    echo 'A';
                }
            }

            trait B{
                public function smallTalk(){
                    echo 'b';
                }

                public function bigTalk(){
                    echo 'B';
                }
            }

            class TalkerFst{
                use A,B{
                    B::smallTalk insteadof A;
                    A::bigTalk insteadof B;
                }
            }

            class TalkerScn{
                use A,B{
                    B::smallTalk insteadof A;
                    A::bigTalk insteadof B;
                    B::bigTalk as talk;
                }
            }        

二,对象:
    初始化:new实例化一个类;
    转换:
        将一个对象转化成对象,其将不会有任何变化;
        其它任何类型的值被转化程对象,将实例化一个内置类stdClass的对象:
            若该值为null,则新实例为空。
            数组转化为对象将使键名成为属性名并具有相对应的值。
            对于任何其它的值,名为scalar的成员变量将包含该值;
    函数:
        get_class($obj):获取对象$obj的类名;
        is_object($var):检查$var是否为对象;

三,重载:
    PHP中的重载是指通过魔术方法,动态的“创建”类属性和方法。当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。
        所有的重载方法必须声明为publie且不能为static。重载中所用到的魔术方法不能通过引用传递;
    属性重载:
        public void __set($name,$value):在给未定义的变量赋值时调用;
        public mixed __get($name):读取未定义的变量时调用;
        publid bool __isset($name):对未定义的变量调用isset()或empty()时调用;
        public void __unset($name):对未定义的变量使用unset()时调用;
        属性的重载只能在对象中进行,静态方法中,这些魔术方法将不会被调用;
        赋值运算中,__set()的返回值将被忽略。类似$a=$obj->b=9的链式赋值中__get()不会被调用;
        在除isset外的其他语言结构中无法使用重载的属性,即对一个重载的属性使用empty时,重载魔术方法将不会被调用。可以将重载属性赋值到本地变量再使用empty;
    方法重载:
        public mixed __call($name,$ary):当调用一个不可访问的方法时将被调用;
        public static mix __callStatic($name,$ary):静态方法中调用一个不可访问的防滑时将被调用;

四,接口:
    Traversavle:遍历接口,检测一个类是否可以使用foreach进行遍历的接口。无法被单独实现的基本接口,必须由IteratorAggregate或Iterator接口实现。该接口没有任何方法;
    Iterator:可以在内部迭代自己的外部迭代器或类的接口;

    Iterator extends Traversable{
            abstract public mixed current(void):返回当前元素;
            abstract public scalar key(void):返回当前元素的键;
            abstract public void next(void):向前移动到下一个元素,在foreach循环之后调用;
            abstract public void rewind(void):返回迭代器的第一个元素,foreach开始时第一个调用的方法,之后将不会被调用;
            abstract public void valid(void):检测当前位置是否有效,在rewin()和next()后调用;
        }

    IteratorAggregate:聚合式迭代器接口

     IteratorAggregate extends Traversable{
            abstract public Traversable getIterator(void):获取一个外部迭代器
        }

    ArrayAccess:数组式访问接口;

     ArrayAccess{
            abstract public boolean offsetExists(mixed $offset):检查一个偏移位置是否存在,使用isset()或empty()时执行;
            abstract public mixed offsetGet(mixed $offset):获取一个偏移位置的值,使用empty()时,当offsetExists()返回True时才执行;
            abstract public void offsetSet(mixed $offset,mixed $value):设置一个偏移位置的值;
            abstract public void offsetUnset(mixed $offset):复位一个偏移位置的值,使用unset()时执行;
        }

    Serializable:自定义序列化的接口。实现该接口的类将不再支持__sleep()和__wakeup().

    Serialiazable{
            abstract public string serialize(void):返回对象的字符串表示,该方法后__destruct()将不会被调用;
            abstract public mixed unserialize(string $serialized):构造对象,在反序列化时调用,该方法执行之后不会调用__construct();
        }

    Closure:用来代表匿名函数的类;

    Closure{
            __construct(void):禁止实例化;
            public static Closure bind(Closure $closure,object $newthis[,mixed $newscope='static']):
            public Closure bindTo(object $newthis[,mixed $newscope='static']):
        }

五,命名空间:
    在声明命名空间前唯一合法的代码是定义源文件编码方式的declare语句。所有非php代码包括空白符都不能出现在命名空间的声明之前;
    PHP可以定义子命名空间,允许允许将同一个命名空间的内容分割存放在不同的文件中,也可以在同一个文件中定义多个命名空间;
    将全局的非命名空间中的代码与命名空间中的代码组合在一起,只能使用大括号的形式将命名空间中的代码括住,而且全局代码也必须用一个不带名称的namespace语句加大括号括起来;
    原理:命名空间的原理与文件系统相似,类名可以通过三种方式引用:
        1.非限定名称,或不包含前缀的类名。如:$a=new foo();或foo::staticmethod();
            如果但前命名空间是currentnamespace,foo将被解析为currentnamespace\foo;
            如果使用foo的代码是全局的,不包含在任何命名空间中的代码,则foo将被解析为foo;
            如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称将会被解析为全局函数名称或常量名称;
        2.限定名称或包含前缀的类名称。如:$a=new subnamespace\foo()或subnamespace\foo::staticmethod();
            如果当前命名空间是currentnamespace,则foo被解析为currentnamespace\subnamespace\foo;
            如果使用foo的代码是全局的,不包含在任何命名空间中的代码,foo被解析为subnamespace\foo;
        3.完全限定名称,包含了全局前缀操作符。如:$a=new \currentnamespace\foo();或\currentnamespace\foo::staticmethod();
            foo总是被解析为代码中的文字名,即:currentnamespace\foo;
        全局空间:如果没有定义全局命名空间,所有的类和函数的定义都是在全局空间。在名称前加上前缀\表示该名称是全局空间中的名称,即使该名称位于其它命名空间中时也是如此;


posted on 2012-09-08 10:57  柳風  阅读(241)  评论(0)    收藏  举报