亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

PHP學(xué)習(xí) Day 4 語言參考(下半篇)

WelliJhon / 2727人閱讀

摘要:如果有此需要,同樣要使用匿名函數(shù)。以上兩點(diǎn)可以總結(jié)為函數(shù)對(duì)應(yīng)于常量,匿名函數(shù)對(duì)應(yīng)于變量。匿名函數(shù)生成類的實(shí)例類聲明通過表明繼承關(guān)系,不支持多重繼承。覆蓋方法時(shí),參數(shù)必須保持一致,否則會(huì)拋出警告。

函數(shù)

函數(shù)具有全局作用域,可以定義在一個(gè)函數(shù)之內(nèi)而在該函數(shù)之外調(diào)用。


function foo() { function bar() { echo "I don"t exist until foo() is called. "; } } /* 現(xiàn)在還不能調(diào)用bar()函數(shù),因?yàn)樗€不存在 */ foo(); /* 現(xiàn)在可以調(diào)用bar()函數(shù)了,因?yàn)閒oo()函數(shù) 的執(zhí)行使得bar()函數(shù)變?yōu)橐讯x的函數(shù) */ bar();

如果要保證定義在函數(shù)內(nèi)部的函數(shù)外部不可用,需要使用匿名函數(shù):


function foo() { $bar = function() { echo "inside"; }; }

函數(shù)無法重載,無法取消和重定義。如果有此需要,同樣要使用匿名函數(shù)。

以上兩點(diǎn)可以總結(jié)為:函數(shù)對(duì)應(yīng)于常量,匿名函數(shù)對(duì)應(yīng)于變量。

遞歸函數(shù)調(diào)用過百可能會(huì)使堆棧崩潰。

函數(shù)的默認(rèn)參數(shù)只能用常量表達(dá)式定義,不能是變量、函數(shù)調(diào)用!

函數(shù)不能返回多個(gè)值。

從函數(shù)返回引用時(shí),必須在函數(shù)聲明和指派返回值時(shí)都使用引用運(yùn)算符:

function &returns_reference()
{
    return $someref;
}

$newref =& returns_reference();

匿名函數(shù)訪問閉包內(nèi)的變量需要用use ($var)聲明,只讀訪問。

PHP也支持類似Perlsh的函數(shù)定義,在定義時(shí)不指定參數(shù),通過func_num_args()、func_get_arg()func_get_args()處理應(yīng)用函數(shù)時(shí)傳入的參數(shù)。

函數(shù)的參數(shù)可以指定類型,例如對(duì)象(指定類的名字)、接口、數(shù)組、或者callable,但是不能是數(shù)字或字符串,Traits也不允許。(據(jù)說SVN里有支持?jǐn)?shù)字、字符串的一個(gè)實(shí)現(xiàn),但是最后PHP是否會(huì)支持這一特性仍然未定。)

匿名函數(shù)生成Closure類的實(shí)例:

boris> $lambda = function() { echo "hi"; };
 → object(Closure)(

)

class聲明通過extends表明繼承關(guān)系,不支持多重繼承。

可以通過parent::訪問被覆蓋的方法或?qū)傩浴?/p>

父類定義方法時(shí)聲明final,則不可覆蓋。(final還可用于聲明類,final類不能被繼承。)

覆蓋方法時(shí),參數(shù)必須保持一致,否則會(huì)拋出E_STRICT警告。

使用ClassName::class可以獲取類的完全名稱,對(duì)使用了命名空間的類尤其有用。

類的屬性只能初始化為定值!

{
   // 錯(cuò)誤的屬性聲明
   public $var1 = "hello " . "world";
   public $var2 = <<

類中可以定義__construct(),用于建立對(duì)象時(shí)的初始化工作。顯式地銷毀某個(gè)對(duì)象,或者對(duì)某個(gè)對(duì)象的所有引用都沒刪除時(shí),會(huì)執(zhí)行__destruct()。

屬性必須被定義為public、protected(子類、父類可見)、private之一。

類中的方法同理,但是默認(rèn)public

聲明屬性或方法為static,就可以不實(shí)例化而直接訪問,例如通過::。靜態(tài)屬性不能通過對(duì)象來訪問(但靜態(tài)方法可以)。

abstract類不能被實(shí)例化。一旦有一個(gè)方法被聲明為abstract,類就必須被聲明為abstract。繼承抽象類的時(shí)候,子類必須定義父類中的所有抽象方法,并且這些方法的訪問控制不能比父類嚴(yán)格。

abstract class AbstractClass
{
 // 強(qiáng)制要求子類定義這些方法
    abstract protected function getValue();
    abstract protected function prefixValue($prefix);

    // 普通方法(非抽象方法)
    public function printOut() {
        print $this->getValue() . "
";
    }
}

和抽象類相似的概念是接口,接口的特性是接口中定義的所有方法都必須是公有的。

interface a
{
    public function foo();
}

interface b extends a
{
    public function baz(Baz $baz);
}


class c implements b
{
    public function foo()
    {
    }

    public function baz(Baz $baz)
    {
    }
}

實(shí)現(xiàn)接口的類必須實(shí)現(xiàn)接口中定義的所有方法。

類可以實(shí)現(xiàn)多個(gè)接口,用逗號(hào)來分隔多個(gè)接口的名稱。(實(shí)現(xiàn)多個(gè)接口時(shí),接口中的方法不能有重名。)

接口中定義的常量不能被子類或子接口所覆蓋。

使用trait可以水平組合功能:

trait Hello {
    public function sayHello() {
        echo "Hello ";
    }
}

trait World {
    public function sayWorld() {
        echo "World";
    }
}

class MyHelloWorld {
    use Hello, World;
    public function sayExclamationMark() {
        echo "!";
    }
}

trait不能實(shí)例化,優(yōu)先級(jí)比類當(dāng)前成員低,但比繼承的成員高。

多個(gè)trait沖突時(shí),使用insteadof指明使用哪一個(gè)方法,as將方法以其他名稱引入。

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

as還可用于修改訪問控制:

class MyClass1 {
    use HelloWorld { sayHello as protected; }
}
class MyClass2 {
    use HelloWorld { sayHello as private myPrivateHello; }
}

trait可以互相引用:

trait HelloWorld {
    use Hello, World;
}

trait同樣支持抽象方法:

trait Hello {
    public function sayHelloWorld() {
        echo "Hello".$this->getWorld();
    }
    abstract public function getWorld();
}

trait不能定義static 變量,trait定義的靜態(tài)方法,使用trait的類可以用。

trait定義了屬性之后,類不能定義同樣名稱的屬性。

PHP的重載和別的語言不一樣,它指動(dòng)態(tài)地創(chuàng)建屬性和方法。

屬性:

在給不可訪問屬性賦值時(shí),__set()會(huì)被調(diào)用。

讀取不可訪問屬性的值時(shí),__get()會(huì)被調(diào)用。

當(dāng)對(duì)不可訪問屬性調(diào)用 isset()empty() 時(shí),__isset()會(huì)被調(diào)用。

當(dāng)對(duì)不可訪問屬性調(diào)用 unset() 時(shí),__unset() 會(huì)被調(diào)用。

方法:

在對(duì)象中調(diào)用一個(gè)不可訪問方法時(shí),__call() 會(huì)被調(diào)用。

用靜態(tài)方式中調(diào)用一個(gè)不可訪問方法時(shí),__callStatic() 會(huì)被調(diào)用。

foreach可以遍歷對(duì)象的所有可見屬性??梢酝ㄟ^實(shí)現(xiàn)IteratorIteratorAggregate接口來指明如何遍歷。

Traversable是一個(gè)抽象接口,可以用來檢查是否可以被foreach遍歷:

if( !is_array( $items ) && !$items instanceof Traversable )
        //Throw exception here

使用clone關(guān)鍵字可以復(fù)制一個(gè)對(duì)象,對(duì)象的所有屬性是淺復(fù)制。如果定義了__clone()方法,那么復(fù)制完成會(huì)調(diào)用該方法,可用于修改屬性的值。

==屬性、屬性值、類均同。===同一對(duì)象。

PHP 5.3.0 起支持了 late static bindings,綁定的方法會(huì)調(diào)用運(yùn)行時(shí)(late)首先調(diào)用該方法的類,復(fù)用了static關(guān)鍵字。

class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); // Here comes Late Static Bindings
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test(); //  B

對(duì)象變量保存一個(gè)標(biāo)識(shí)符來訪問真正的對(duì)象內(nèi)容,當(dāng)對(duì)象作為參數(shù)傳遞,作為結(jié)果返回,或者賦值給另外一個(gè)變量,另外一個(gè)變量跟原來的不是引用的關(guān)系,只是他們都保存著同一個(gè)標(biāo)識(shí)符的拷貝,這個(gè)標(biāo)識(shí)符指向同一個(gè)對(duì)象的真正內(nèi)容。

所有php里面的值都可以使用函數(shù)serialize()來返回一個(gè)字符串表示。 unserialize()函數(shù)能夠重新把字符串變回php原來的值。序列化一個(gè)對(duì)象將會(huì)保存對(duì)象的所有變量,但是不會(huì)保存對(duì)象的方法,只會(huì)保存類的名字。

魔術(shù)方法以__開頭,除了上面提到的以外,還有:

__sleep()__wakeup(),分別對(duì)應(yīng)于serialize()unserialize(),一個(gè)常用于提交未提交的數(shù)據(jù),一個(gè)常用于執(zhí)行初始化操作。

__toString() 方法用于一個(gè)類被當(dāng)成字符串時(shí)應(yīng)怎樣回應(yīng)。

__invoke() 當(dāng)嘗試以調(diào)用函數(shù)的方式調(diào)用一個(gè)對(duì)象時(shí)調(diào)用此方法。

__set_state(),用于 var_export() 導(dǎo)出類時(shí)。

如果類實(shí)現(xiàn)了Serializable接口,那么這個(gè)類就不再支持__sleep()__wakeup()。

命名空間

類、函數(shù)、常量受命名空間的影響。

通過namespace聲明,必須在所有代碼(除declare編碼語句)之前(包括非PHP代碼)。

同一個(gè)命名空間的內(nèi)容可以分割存放在不同文件中。

命名空間可以分層定義:

namespace MyProjectSubLevel;

可以在同一文件中定義多個(gè)命名空間,但是不推薦。如果實(shí)在要這么做,建議用大括號(hào)括起不同的命名空間。將全局的非命名空間代碼和命名空間的代碼組合時(shí),必須加大括號(hào)。全局代碼用不帶名稱的namespace語句聲明。

常量__NAMESPACE__的值是包含當(dāng)前命名空間名稱的字符串。關(guān)鍵字namespace可用來顯式訪問當(dāng)前命名空間或子命名空間中的元素。它等價(jià)于類中的 self 操作符。

命名空間名稱或類名稱可以使用別名:

namespace foo;
use MyFullClassname as Another;

命名空間內(nèi)部,用 表示該名稱是全局空間中的名稱。

異常處理

使用throw、catch、try語句。

function inverse($x) {
    if (!$x) {
        throw new Exception("Division by zero.");
    }
    else return 1/$x;
}

try {
    echo inverse(5) . "
";
    echo inverse(0) . "
";
} catch (Exception $e) {
    echo "Caught exception: ",  $e->getMessage(), "
";
}

// Continue execution
echo "Hello World";

Exception 類

Exception {
  /* 屬性 */
  protected string $message ;
  protected int $code ;
  protected string $file ;
  protected int $line ;
  /* 方法 */
  public __construct ([ string $message = "" [, int $code = 0 [, Exception $previous = NULL ]]] )
  final public string getMessage ( void )
  final public Exception getPrevious ( void )
  final public int getCode ( void )
  final public string getFile ( void )
  final public int getLine ( void )
  final public array getTrace ( void )
  final public string getTraceAsString ( void )
  public string __toString ( void )
  final private void __clone ( void )
生成器

通常只需用yield取代return。

例如,用生成器重新實(shí)現(xiàn)低內(nèi)存占用的range()函數(shù):

function xrange($start, $limit, $step = 1) {
    if ($start < $limit) {
        if ($step <= 0) {
            throw new LogicException("Step must be +ve");
        }

        for ($i = $start; $i <= $limit; $i += $step) {
            yield $i;
        }
    } else {
        if ($step >= 0) {
            throw new LogicException("Step must be -ve");
        }

        for ($i = $start; $i >= $limit; $i += $step) {
            yield $i;
        }
    }
}

yield可以返回鍵值對(duì):

function input_parser($input) {
    foreach (explode("
", $input) as $line) {
        $fields = explode(";", $line);
        $id = array_shift($fields);

        yield $id => $fields;
    }
}

生成器函數(shù)第一次調(diào)用時(shí),會(huì)返回一個(gè)內(nèi)部的Generator類(無法使用new實(shí)例化的類)的對(duì)象。類似于Iterator接口,但是多了一個(gè)send()方法。

Generator::send()允許迭代的時(shí)候插入值。插入的值會(huì)被yield語句返回,并且可以在生成器函數(shù)中使用。

相比實(shí)現(xiàn)一個(gè)Iterator類,生成器要簡(jiǎn)單地多,往往能提升代碼可讀性。

超全局變量

在一個(gè)腳本的全部作用域中都可用。

$GLOBALS

$_SERVER

$_GET

$_POST

$_FILES

$_COOKIE

$_SESSION

$_SESSION

$_REQUEST

$_ENV

其他預(yù)定義變量

$php_errormsg (僅在 php.ini 文件中的 track_errors 配置項(xiàng)開啟的情況下可用。默認(rèn)關(guān)閉。)

$argc

$argv

ArrayAccess接口

實(shí)現(xiàn)了這一接口的類可以當(dāng)數(shù)組用。

ArrayAccess {
  /* Methods */
  abstract public boolean offsetExists ( mixed $offset )
  abstract public mixed offsetGet ( mixed $offset )
  abstract public void offsetSet ( mixed $offset , mixed $value )
  abstract public void offsetUnset ( mixed $offset )
}

Day 0 - 5 列表

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/20637.html

相關(guān)文章

  • PHP學(xué)習(xí)之路 目錄

    這個(gè)系列就暫時(shí)告一段落了。這是一個(gè)目錄。 Day 0 起步 Day 1 基本語法 Day 2 REPL 和 包管理 Day 3 語言參考 Day 4 語言參考(下半篇) Day 5 練手程序

    liaosilzu2007 評(píng)論0 收藏0
  • PHP學(xué)習(xí) Day 3 語言參考

    摘要:掃下手冊(cè)的語言參考。允許的強(qiáng)制轉(zhuǎn)換有。錯(cuò)誤控制置于表達(dá)式前時(shí),忽略該表達(dá)式產(chǎn)生的錯(cuò)誤信息。運(yùn)行外部程序使用反引號(hào),效果等同于函數(shù)。文件未找到時(shí),給出錯(cuò)誤,而僅僅給出警告。目標(biāo)位置用目標(biāo)名稱加上冒號(hào)標(biāo)記,必須位于同一文件和作用域。 掃下手冊(cè)的語言參考。(函數(shù)以前) 類型 有boolean、integer、float、string、array等類型。 可以通過gettype函數(shù)查看類...

    sean 評(píng)論0 收藏0
  • PHP學(xué)習(xí) Day 2 REPL 和 包管理

    摘要:包管理試用了,新一代的包管理器,感覺不錯(cuò)。習(xí)題答案習(xí)題見圖書優(yōu)惠活動(dòng),計(jì)算需要付的金額。文件讀寫函數(shù)有,表示追加,鎖定文件,避免別的進(jìn)程同時(shí)讀寫。 最新版 Debian Wheezy下的PHP是5.4的,day0時(shí)說圖方便就裝了5.4。但是看文檔是5.5的,所以琢磨著還是用最新版算了。 Debian Wheezy有dotdeb.org提供php-5.5。安裝很方便。 將下列內(nèi)容加...

    microelec 評(píng)論0 收藏0
  • PHP學(xué)習(xí) Day 0 起步

    摘要:記錄一下學(xué)習(xí)的軌跡。起步推薦用最新的。內(nèi)建服務(wù)器這年頭大部分語言都支持這一出了。交互式的環(huán)境學(xué)習(xí)方便,推薦下家的是用寫的。結(jié)尾可以省略,然后可以簡(jiǎn)寫成,于是上面的可以簡(jiǎn)寫成當(dāng)然像這種一行的,用也成練習(xí)題感謝出題搭好環(huán)境,寫出第一個(gè)。 記錄一下學(xué)習(xí)的軌跡。 入門資料 對(duì)我而言好的入門資料要符合兩個(gè)要求: 能夠切實(shí)幫助以比較正的方式入門 薄 真沒找到什么好的入門資料。沒有《Di...

    Cruise_Chan 評(píng)論0 收藏0
  • 云計(jì)算下半場(chǎng) 哪些會(huì)成為關(guān)注點(diǎn)

    摘要:云計(jì)算從概念萌芽期如今正在成為基礎(chǔ)設(shè)施的水和電。他們共同對(duì)云計(jì)算的下一步發(fā)展特點(diǎn)以及企業(yè)關(guān)注重點(diǎn)等問題進(jìn)行了討論。所以,在國內(nèi)說云計(jì)算發(fā)展的下一個(gè)階段似乎比下半場(chǎng)更加合適,那么下一個(gè)階段將有哪些新的特點(diǎn)呢各位嘉賓也提出了自己的看法。 云計(jì)算可以說是近幾年企業(yè)服務(wù)發(fā)展最快的領(lǐng)域之一,同時(shí)也是產(chǎn)業(yè)互聯(lián)網(wǎng)發(fā)展的基礎(chǔ)。云計(jì)算從概念萌芽期如今正在成為 IT 基礎(chǔ)設(shè)施的水和電。12 月 21 日,幾位云...

    Achilles 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<