關於phpunsetdestruct的信息

本文目錄一覽:

php 實例化對象如果不主動刪除,什麼時候從自動內存中刪除此對象

php作為腳本語言是頁面結束即釋放變量所佔內存的.

當一個 PHP線程結束時,當前佔用的所有內存空間都會被銷毀,當前程序中所有對象同時被銷毀。

GC進程一般都跟着每起一個SESSION而開始運行的.gc目的是為了在session文件過期以後自動銷毀刪除這些文件.

在PHP中,沒有任何變量指向這個對象時,這個對象就成為垃圾。PHP會將其在內存中銷毀;這是PHP 的GC垃圾處理機制,防止內存溢出。類似與C++中的智能指針一樣。

執行這些函數也可以起到回收作用 __destruct /unset/mysql_close /fclose

php對session有明確的gc處理時間設定 session.gc_maxlifetime 如果說有垃圾,那就是整體的程序在框架使用中,會多次調用同一文件等等造成的非單件模式等。

析構函數:當某個對象成為垃圾或者當對象被顯式銷毀時執行。

GC(Garbage Collector)

在PHP中,沒有任何變量指向這個對象時,這個對象就成為垃圾。PHP會將其在內存中銷毀。

這是PHP的GC(Garbage Collector)垃圾處理機制,防止內存溢出。

當一個PHP線程結束時,當前佔用的所有內存空間都會被銷毀,當前程序中的所有對象同樣被銷毀。

__destruct() 析構函數,是在垃圾對象被回收時執行。

析構函數也可以被顯式調用,但不要這樣去做。

析構函數是由系統自動調用的,不要在程序中調用一個對象的虛構函數。

析構函數不能帶有參數。

請詳細說明一下php5中的魔術方法

PHP處理對象部分的內核完全重新開發過,提供更多功能的同時也提高了性能。在以前版本的php中,處理對象和處理基本類型(數字,字符串)的方式是一樣的。這種方式的缺陷是:當將對象賦值給一個變量時,或者通過參數傳遞對象時,對象將被完全拷貝一份。在新的版本里,上述操作將傳遞引用(可以把引用理解成對象的標識符),而非值。

很多PHP程序員可能甚至沒有察覺到老的對象處理方式。事實上,大多數的php應用都可以很好地運行。或者僅僅需要很少的改動。

私有和受保護成員

PHP5引入了私有和受保護成員變量的概念。我們可以用它來定義類成員的可見性。

例子

受保護成員可以被子類訪問, 而私有成員只能被類本身訪問。

代碼:——————————————————————————–

?php

class MyClass {

private $Hello = “Hello, World!\n”;

protected $Bar = “Hello, Foo!\n”;

protected $Foo = “Hello, Bar!\n”;

function printHello() {

print “MyClass::printHello() ” . $this-Hello;

print “MyClass::printHello() ” . $this-Bar;

print “MyClass::printHello() ” . $this-Foo;

}

}

class MyClass2 extends MyClass {

protected $Foo;

function printHello() {

MyClass::printHello(); /* Should print */

print “MyClass2::printHello() ” . $this-Hello; /* Shouldn’t print out anything */

print “MyClass2::printHello() ” . $this-Bar; /* Shouldn’t print (not declared)*/

print “MyClass2::printHello() ” . $this-Foo; /* Should print */

}

}

$obj = new MyClass();

print $obj-Hello; /* Shouldn’t print out anything */

print $obj-Bar; /* Shouldn’t print out anything */

print $obj-Foo; /* Shouldn’t print out anything */

$obj-printHello(); /* Should print */

$obj = new MyClass2();

print $obj-Hello; /* Shouldn’t print out anything */

print $obj-Bar; /* Shouldn’t print out anything */

print $obj-Foo; /* Shouldn’t print out anything */

$obj-printHello();

?

——————————————————————————–

私有方法和受保護方法

PHP5也引入了私有方法和受保護方法的概念。

例子:

代碼:——————————————————————————–

?php

class Foo {

private function aPrivateMethod() {

echo “Foo::aPrivateMethod() called.\n”;

}

protected function aProtectedMethod() {

echo “Foo::aProtectedMethod() called.\n”;

$this-aPrivateMethod();

}

}

class Bar extends Foo {

public function aPublicMethod() {

echo “Bar::aPublicMethod() called.\n”;

$this-aProtectedMethod();

}

}

$o = new Bar;

$o-aPublicMethod();

?

——————————————————————————–

以前的不使用類的老代碼,沒有訪問修飾符(public, protected, private)的代碼可以不經改動運行。

抽象類和抽象方法

Php5也引入了抽象類和抽象方法的概念。抽象方法只是聲明了方法的簽名並不提供它的實現。包含抽象方法的類必須被聲明成抽象類。

例子:

代碼:——————————————————————————–

?php

abstract class AbstractClass {

abstract public function test();

}

class ImplementedClass extends AbstractClass {

public function test() {

echo “ImplementedClass::test() called.\n”;

}

}

$o = new ImplementedClass;

$o-test();

?

——————————————————————————–

抽象類不能被實例化。以前的不使用抽象類的老代碼可以不經改動運行。

接口

Php5引入了接口。一個類可以實現多個接口。

例子:

代碼:——————————————————————————–

?php

interface Throwable {

public function getMessage();

}

class MyException implements Throwable {

public function getMessage() {

// …

}

}

?

——————————————————————————–

以前的不使用接口的老代碼可以不經改動運行

類的型別提示

PHP5依然是弱類型的,不過在定義函數參數時,可以使用類的型別提示來聲明期望傳入的對象類型

Example

代碼:——————————————————————————–

?php

interface Foo {

function a(Foo $foo);

}

interface Bar {

function b(Bar $bar);

}

class FooBar implements Foo, Bar {

function a(Foo $foo) {

// …

}

function b(Bar $bar) {

// …

}

}

$a = new FooBar;

$b = new FooBar;

$a-a($b);

$a-b($b);

?

——————————————————————————–

和其他強類型語言一樣,php5類的型別提示在運行期間檢查而非編譯期間檢查。即:

代碼:——————————————————————————–

?php

function foo(ClassName $object) {

// …

}

?

和下面的代碼是一樣的:

?php

function foo($object) {

if (!($object instanceof ClassName)) {

die(“Argument 1 must be an instance of ClassName”);

}

}

?

——————————————————————————–

這個語法只適用於類,不適用於內建類型。

Final

PHP 5 引入了final關鍵字來聲明final成員和final方法。final成員和final方法不能被子類覆蓋。

Example

代碼:——————————————————————————–

?php

class Foo {

final function bar() {

// …

}

}

?

——————————————————————————–

更進一步,可以把類聲明成final。將類聲明成final可以阻止這個類被繼承。final類裡面的方法缺省地都是final的,無需再聲明一次。

Example

代碼:——————————————————————————–

?php

final class Foo {

// class definition

}

// the next line is impossible

// class Bork extends Foo {}

?

——————————————————————————–

屬性不能定義成為final.

以前的不使用final的老代碼可以不經改動運行.

對象克隆

Php4沒有提供一種機制來讓用戶自己定義複製構造子(copy constructor)控制對象的複製過程。Php4做二進制的拷貝,因而很精確地複製了對象的所有屬性。

精確地複製對象的所有屬性可能並不是我們一直想要的。有個例子可以很好地說明我們確實需要複製構造子:比如一個GTK Window的對象 a。 a持有它所需要的全部資源。當複製的這個GTK Window到對象b時候,我們更希望b持有新的資源對象。再舉個例子:對象a包含了一個對象c, 當你把對象a 複製到對象c的時候。我們可能更希望對象b包含一個新的對象c的copy, 而不是一個對象c的引用。(譯者註:這裡所說的就是淺克隆和深克隆。)

對象的複製是通過clone這個關鍵字達到的(Clone調用被克隆對象的__clone()方法)。對象的__clone方法不能夠直接被調用。

代碼:——————————————————————————–

?php

$copy_of_object = clone $object;

?

——————————————————————————–

當developer創建對象的一份拷貝的時候,php5將會檢查 __clone()方法是否存在。如果不存在,那麼它就會呼叫缺省的__clone()方法,複製對象的所有屬性。如果__clone()方法已經定義過,那麼_clone()方法就會負責設置新對象的屬性。為了方便起見,Engine會缺省地複製所有的屬性。所以在__clone()方法中,只需要覆蓋那些需要更改的屬性就可以了。如下:

Example

代碼:——————————————————————————–

?php

class MyCloneable {

static $id = 0;

function MyCloneable() {

$this-id = self::$id++;

}

function __clone() {

$this-address = “New York”;

$this-id = self::$id++;

}

}

$obj = new MyCloneable();

$obj-name = “Hello”;

$obj-address = “Tel-Aviv”;

print $obj-id . “\n”;

$obj_cloned = clone $obj;

print $obj_cloned-id . “\n”;

print $obj_cloned-name . “\n”;

print $obj_cloned-address . “\n”;

?

——————————————————————————–

統一構造函數

Php5允許開發者聲明一個類的構造方法。擁有構造方法的類在每次創建新的對象的時候都會呼叫這個方法,因此構造方法適合對象在被使用之前的初始化工作

Php4中,構造方法的名稱和類的名稱一樣。考慮到從子類構造方法呼叫父類構造方法的情況是非常普遍的,而將類從一個繼承體系中搬遷引起的父類變更就常常導致需要更改類的構造方法,php4的做法顯然是不太合理的。

Php5引入了一個聲明構建函數的標準方法: __construct().如下:

Example

代碼:——————————————————————————–

?php

class BaseClass {

function __construct() {

print “In BaseClass constructor\n”;

}

}

class SubClass extends BaseClass {

function __construct() {

parent::__construct();

print “In SubClass constructor\n”;

}

}

$obj = new BaseClass();

$obj = new SubClass();

?

——————————————————————————–

為保持向後的兼容性,如果php5不能夠找到 __construct(),它會尋找老式的構造方法,即與類同名的方法。簡單的說,只有當老代碼里包含了一個__construct()方法的時候,才存在一個兼容性的問題。

析構方法

對於面向對象的編程來說,可以定義析構方法是非常有用的一個功能。析構方法可以用來記錄調試信息,關閉數據庫連接等等一些清除收尾的工作。Php4中沒有析構方法,儘管php4已經支持可以註冊一個函數以便請求結束的時候被調用。

Php5引進的析構方法的概念和其他面向對象的語言(比如java)是一致的。當指向這個對象的最後一個引用被銷毀的時候,析構方法被調用,調用完成後釋放內存。注意:析構方法不接受任何參數。

Example

代碼:——————————————————————————–

?php

class MyDestructableClass {

function __construct() {

print “In constructor\n”;

$this-name = “MyDestructableClass”;

}

function __destruct() {

print “Destroying ” . $this-name . “\n”;

}

}

$obj = new MyDestructableClass();

?

——————————————————————————–

和構建方法一樣,父類的析構方法也不會被隱含調用。子類可以在自己的析構方法通過調用parent::__destruct()來顯式地調用它。

Constants

Php5引入了class級別的常量。

代碼:——————————————————————————–

?php

class Foo {

const constant = “constant”;

}

echo “Foo::constant = ” . Foo::constant . “\n”;

?

——————————————————————————–

老的沒有使用const的代碼仍然正常運行。

Exceptions

Php4沒有異常控制。Php5引入了和其它語言(java)相似的異常控制模式。應該注意的是php5裡面支持捕捉全部異常,但是不支持finally子句。

在catch語句塊裡面,可以重新拋出異常。也可以有多個catch語句,在這種情況下,被捕捉到的異常從上往下依次比較和catch語句比較異常,第一個類型匹配的catch語句將會被執行。如果一直搜索到底還沒有發現匹配的catch子句,則尋找下一個try/catch語句。最後不能捕捉的異常將被顯示出來。如果異常被捕捉,那麼程序會接着catch語句塊的下面開始執行。

Example

代碼:——————————————————————————–

?php

class MyException {

function __construct($exception) {

$this-exception = $exception;

}

function Display() {

print “MyException: $this-exception\n”;

}

}

class MyExceptionFoo extends MyException {

function __construct($exception) {

$this-exception = $exception;

}

function Display() {

print “MyException: $this-exception\n”;

}

}

try {

throw new MyExceptionFoo(‘Hello’);

}

catch (MyException $exception) {

$exception-Display();

}

catch (Exception $exception) {

echo $exception;

}

?

——————————————————————————–

上面的例子表明可以定義一個並不繼承自 Exception的異常類,但是,最好還是從Exception繼承並定義自己的異常。這是因為系統內建的Exception類能夠收集到很多有用的信息, 而不繼承它的異常類是得不到這些信息的。下面的php代碼模仿了系統內建Exception類。每個屬性後面都加了注釋。每個屬性都有一個getter,由於這些getter方法經常被系統內部處理調用,所以這些方法被標明了final。

Example

代碼:——————————————————————————–

?php

class Exception {

function __construct(string $message=NULL, int code=0) {

if (func_num_args()) {

$this-message = $message;

}

$this-code = $code;

$this-file = __FILE__; // of throw clause

$this-line = __LINE__; // of throw clause

$this-trace = debug_backtrace();

$this-string = StringFormat($this);

}

protected $message = ‘Unknown exception’; // exception message

protected $code = 0; // user defined exception code

protected $file; // source filename of exception

protected $line; // source line of exception

private $trace; // backtrace of exception

private $string; // internal only!!

final function getMessage() {

return $this-message;

}

final function getCode() {

return $this-code;

}

final function getFile() {

return $this-file;

}

final function getTrace() {

return $this-trace;

}

final function getTraceAsString() {

return self::TraceFormat($this);

}

function _toString() {

return $this-string;

}

static private function StringFormat(Exception $exception) {

// … a function not available in PHP scripts

// that returns all relevant information as a string

}

static private function TraceFormat(Exception $exception) {

// … a function not available in PHP scripts

// that returns the backtrace as a string

}

}

?

——————————————————————————–

如果我們定義的一異常類都是繼承自Exception基類

無兼容性問題。老的代碼不會受到這一特性的影響。

Dereferencing objects returned from functions

Php4中不能再次引用函數返回的對象以進一步呼叫返回對象的方法,而php5是可以的。

代碼:——————————————————————————–

?php

class Circle {

function draw() {

print “Circle\n”;

}

}

class Square {

function draw() {

print “Square\n”;

}

}

function ShapeFactoryMethod($shape) {

switch ($shape) {

case “Circle”:

return new Circle();

case “Square”:

return new Square();

}

}

ShapeFactoryMethod(“Circle”)-draw();

ShapeFactoryMethod(“Square”)-draw();

?

——————————————————————————–

靜態成員變量能夠被初始化。

Example

代碼:——————————————————————————–

?php

class foo {

static $my_static = 5;

public $my_prop = ‘bla’;

}

print foo::$my_static;

$obj = new foo;

print $obj-my_prop;

?

——————————————————————————–

靜態方法

PHP 5 引入了靜態方法,可以在不實例化類的情況下呼叫靜態方法。

Example

代碼:——————————————————————————–

?php

class Foo {

public static function aStaticMethod() {

// …

}

}

Foo::aStaticMethod();

?

——————————————————————————–

偽變量$this不能夠在靜態方法方法中使用。

instanceof

Php5引入了instanceof關鍵字,允許用它來測試一個對象是一個類的實例,或者是一個派生類的實例,或者實現了某個接口

Example

代碼:——————————————————————————–

?php

class baseClass { }

$a = new baseClass;

if ($a instanceof baseClass) {

echo “Hello World”;

}

?

——————————————————————————–

Static function variables

現在,靜態變量在編譯階段處理。因此程序員可以通過引用為靜態變量賦值。這可以改善性能,不過,不能夠使用對靜態變量的間接引用了。

按引用傳遞的函數參數現在也可以設置缺省值了。

Example

代碼:——————————————————————————–

?php

function my_function($var = null) {

if ($var === null) {

die(“$var needs to have a value”);

}

}

?

——————————————————————————–

__autoload()

__autoload() 攔截函數在一個未聲明的類被初始化的時候自動調用。該類的名字會被自動傳遞給__autoload()函數。而__autoload()也只有這麼唯一的一個參數。

Example

代碼:——————————————————————————–

?php

function __autoload($className) {

include_once $className . “.php”;

}

$object = new ClassName;

?

——————————————————————————–

可重載的方法呼叫和屬性訪問

方法呼叫和屬性訪問都能夠通過__call, __get() and __set()方法重載。

Example: __get() and __set()

代碼:——————————————————————————–

?php

class Setter {

public $n;

public $x = array(“a” = 1, “b” = 2, “c” = 3);

function __get($nm) {

print “Getting [$nm]\n”;

if (isset($this-x[$nm])) {

$r = $this-x[$nm];

print “Returning: $r\n”;

return $r;

} else {

print “Nothing!\n”;

}

}

function __set($nm, $val) {

print “Setting [$nm] to $val\n”;

if (isset($this-x[$nm])) {

$this-x[$nm] = $val;

print “OK!\n”;

} else {

print “Not OK!\n”;

}

}

}

$foo = new Setter();

$foo-n = 1;

$foo-a = 100;

$foo-a++;

$foo-z++;

var_dump($foo);

?

——————————————————————————–

Example: __call()

代碼:——————————————————————————–

?php

class Caller {

private $x = array(1, 2, 3);

function __call($m, $a) {

print “Method $m called:\n”;

var_dump($a);

return $this-x;

}

}

$foo = new Caller();

$a = $foo-test(1, “2”, 3.4, true);

var_dump($a);

?

——————————————————————————–

迭代

當和foreach一起使用對象的時候,迭代的方式被重載過了。缺省的行為是迭代類的所有屬性。

Example

代碼:——————————————————————————–

?php

class Foo {

public $x = 1;

public $y = 2;

}

$obj = new Foo;

foreach ($obj as $prp_name = $prop_value) {

// using the property

}

?

——————————————————————————–

一個類的所有對象都能夠被迭代瀏覽到, 如果這個類實現了一個空的接口:Traversable. 換句話說,實現了Traversable接口的類可以和foreach一起使用。

接口 IteratorAggregate 和Iterator允許指定類的對象在代碼中如何迭代。IteratorAggregate接口有一個方法:getIterator() 必須返回一個數組

Example

代碼:——————————————————————————–

?php

class ObjectIterator implements Iterator {

private $obj;

private $num;

function __construct($obj) {

$this-obj = $obj;

}

function rewind() {

$this-num = 0;

}

function valid() {

return $this-num $this-obj-max;

}

function key() {

return $this-num;

}

function current() {

switch($this-num) {

case 0: return “1st”;

case 1: return “2nd”;

case 2: return “3rd”;

default: return $this-num.”th”;

}

}

function next() {

$this-num++;

}

}

class Object implements IteratorAggregate {

public $max = 3;

function getIterator() {

return new ObjectIterator($this);

}

}

$obj = new Object;

// this foreach …

foreach($obj as $key = $val) {

echo “$key = $val\n”;

}

// matches the following 7 lines with the for directive.

$it = $obj-getIterator();

for($it-rewind(); $it-hasMore(); $it-next) {

$key = $it-current();

$val = $it-key();

echo “$key = $val\n”;

}

unset($it);

?

——————————————————————————–

新的__toString方法

可以通過覆蓋__toString方法來控制對象到字符串的轉換。

Example

代碼:—————————————

php 在類中如何釋放內存。

unset()是可以釋放內存的,但是$str=null基本釋放不了的,建議還是用unset()就好了,$str=null只是用來清空變量,以防下面再用的時候遭到干擾的。

php什麼是魔術方法

__construct(),

__destruct(),

__call(),

__callStatic(),

__get(),

__set(),

__isset(),

__unset(),

__sleep(),

__wakeup(),

__toString(),

__invoke(),

__set_state(),

__clone()

__debugInfo()

等方法在

PHP

中被稱為”魔術方法”(Magic

methods)。在命名自己的類方法時不能使用這些方法名,除非是想使用其魔術功能。

php魔術方法。。

在 PHP 里,將所有以 __(兩個下劃線)開頭的類方法保留為魔術方法,所以在定義類方法時,除了上述魔術方法,建議不要以 __ 為前綴。

魔術方法的引入是對面向對象編程思想的進一步實現,重載就是通過魔術方法來實現的。

PHP 魔術方法主要有:

__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(),__sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo() 等。

最常見的是__construct(), __destruct(),__get(), __set()等:

__construct和__destruct是類的構造函數和析構函數。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/190750.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-30 09:06
下一篇 2024-11-30 09:06

相關推薦

  • Java 監控接口返回信息報錯信息怎麼處理

    本文將從多個方面對 Java 監控接口返回信息報錯信息的處理方法進行詳細的闡述,其中包括如何捕獲異常、如何使用日誌輸出錯誤信息、以及如何通過異常處理機制解決報錯問題等等。以下是詳細…

    編程 2025-04-29
  • 使用Python爬蟲獲取電影信息的實現方法

    本文將介紹如何使用Python編寫爬蟲程序,來獲取和處理電影數據。需要了解基本的Python編程語言知識,並使用BeautifulSoup庫和Requests庫進行爬取。 一、準備…

    編程 2025-04-28
  • Python爬取網頁信息

    本文將從多個方面對Python爬取網頁信息做詳細的闡述。 一、爬蟲介紹 爬蟲是一種自動化程序,可以模擬人對網頁進行訪問獲取信息的行為。通過編寫代碼,我們可以指定要獲取的信息,將其從…

    編程 2025-04-28
  • 如何使用Python執行Shell命令並獲取執行過程信息

    本文將介紹如何使用Python執行Shell命令並獲取執行過程信息。我們將從以下幾個方面進行闡述: 一、執行Shell命令 Python內置的subprocess模塊可以方便地執行…

    編程 2025-04-28
  • Python實現身份信息模擬生成與查驗

    本文將從以下幾個方面對Python實現身份信息模擬生成與查驗進行詳細闡述: 一、身份信息生成 身份信息生成是指通過代碼生成符合身份信息規範的虛假數據。Python中,我們可以使用f…

    編程 2025-04-27
  • Dapper使用getschema獲取表信息

    本文旨在介紹Dapper中使用getschema獲取表信息的方法和注意事項。 一、獲取某張表的所有列信息 使用Dapper獲取某張表信息,可以使用 `IDbConnection.G…

    編程 2025-04-27
  • 通過提交信息搜索-使用git

    本篇文章重點講解如何使用git通過提交信息來搜索。我們將從多個方面介紹如何使用git來搜索提交信息,並提供相應的代碼示例以供參考。 一、搜索方式 Git提供了三種搜索方式,分別為:…

    編程 2025-04-27
  • 已裝備我軍的空中信息化作戰平台

    本文將會從多個方面詳細闡述已裝備我軍的空中信息化作戰平台。 一、平台概述 已裝備我軍的空中信息化作戰平台是一個全新的作戰系統,具備實時數據採集、處理、分析、共享的能力。它可以在不同…

    編程 2025-04-27
  • Linux查看系統信息

    一、CPU信息 Linux系統下,查看CPU的信息最常用的命令是lscpu。該命令可以顯示CPU架構、核心數量、線程數、緩存大小、CPU頻率等信息。例如: lscpu 該命令會輸出…

    編程 2025-04-24
  • 軟考 信息安全工程師

    軟考 信息安全工程師是一項技能型國家級資格認證考試,主要測試考生在信息安全領域的理論知識和實踐技能,是證明個人信息安全能力的重要證書。本文將從多個方面對軟考 信息安全工程師做詳細的…

    編程 2025-04-23

發表回復

登錄後才能評論