
批改狀態(tài):合格
老師批語:
1.原理: 動(dòng)態(tài)的創(chuàng)建屬性和方法.
2.實(shí)現(xiàn): 通過魔術(shù)方法[__set,__get,__isset,__unset,__call,__callStatic]來實(shí)現(xiàn).
實(shí)例:
// 實(shí)例:
class Demo1
{
private $overloadData = [];
public $name;
public $email;
public function __construct($name, $email)
{
$this->name = $name;
$this->email = $email;
}
public function getUser(): string
{
return "{$this->name} : {$this->email}";
}
public function insertData($name): string
{
$this->overloadData[$name] = $name;
echo nl2br("創(chuàng)建成功...\n");
return $this->overloadData[$name];
}
// 當(dāng)調(diào)用未設(shè)置的屬性時(shí),會(huì)自動(dòng)調(diào)用
public function __get($name): string
{
if (array_key_exists($name, $this->overloadData)) {
return $this->overloadData[$name];
} else {
echo nl2br("沒有該屬性$name, 嘗試創(chuàng)建中.....\n");
return $this->insertData($name);
}
}
// 當(dāng)對(duì)未設(shè)置的屬性賦值時(shí),會(huì)自動(dòng)調(diào)用
public function __set($name, $value)
{
// echo "$name : $value<br>";
$this->overloadData[$name] = $value;
}
// 當(dāng)對(duì)未設(shè)置的屬性調(diào)用isset()方法并且時(shí),會(huì)自動(dòng)調(diào)用
public function __isset($name): string
{
echo "Is '{$name}' set?\n";
return isset($this->overloadData[$name]);
}
// 當(dāng)對(duì)未設(shè)置的屬性調(diào)用unset()方法并且時(shí),會(huì)自動(dòng)調(diào)用
public function __unset($name)
{
echo "類實(shí)例中沒有 '$name'\n";
unset($this->overloadData[$name]);
}
// 當(dāng)訪問的非靜態(tài)方法不存在時(shí),會(huì)自動(dòng)調(diào)用該方法
public function __call($funcName, $ages)
{
return "函數(shù)名: $funcName, 參數(shù): [" . implode(', ', $ages) . "]";
}
// 當(dāng)訪問的靜態(tài)方法不存在時(shí),會(huì)自動(dòng)調(diào)用該方法
public static function __callStatic($funcName, $ages)
{
return "靜態(tài)函數(shù)名: $funcName, 參數(shù): [" . implode(', ', $ages) . "]";
}
}
$objTest0222 = new Demo1('張三', 'admin@test.com');
echo $objTest0222->name, '<br>';
echo $objTest0222->email, '<br>';
echo $objTest0222->getUser(), '<hr>';
// 調(diào)用沒有創(chuàng)建的屬性
echo $objTest0222->a, '<br>';
echo '<hr>';
// 對(duì)為創(chuàng)建的屬性賦值
$objTest0222->aa = '隨便賦的值';
echo $objTest0222->aa, '<br>';
echo '<hr>';
// 對(duì)未創(chuàng)建的屬性調(diào)用isset或者unset
var_dump(isset($objTest0222->aaa));
unset($objTest0222->aaa);
echo '<hr>';
// 調(diào)用沒有創(chuàng)建的方法時(shí)
// 非靜態(tài)方法
echo $objTest0222->testtest(1,2,3,4,5,6), '<br>';
echo Demo1::testtestStatic(...([6,5,4,3,2,1])), '<br>';
全局成員: 類, 常量, 函數(shù)
const PATH = '/0222/test2/';
class Test2Demo1
{
//...
}
function test2Demo1()
{
// ....
}
// 命名空間的創(chuàng)建由關(guān)鍵值nampspace修飾
namespace ts {
}
// 訪問空間成員
namespace ts1 {
const PATH = '/0222/test2';
class Test2Demo1
{
public function text2Demo1(): string
{
return '我是空間內(nèi)類的函數(shù): ' . __METHOD__;
}
}
function test2Demo1(): string
{
return '我是空間內(nèi)的函數(shù): ' . __FUNCTION__;
}
echo PATH, '<br>'; // 或者 \ts1\PATH 或者 namespace\PATH ,這三種方式訪問都可以
echo (new Test2Demo1())->text2Demo1(), '<br>';
echo test2Demo1(), '<br>';
}
空間成員的分解: 當(dāng)一個(gè)空間內(nèi)的代碼過長時(shí),可以把同一個(gè)空間內(nèi)的代碼分解到多個(gè)php腳本文件中.
實(shí)例:
<?php
namespace test2;
require 'test2-2.php';
require 'test2-3.php';
const PATH = '/0222/test2';
// 訪問空間成員
echo PATH, '<br>';
echo (new Test2Demo1())->text2Demo1(), '<br>';
echo test2Demo1(), '<br>';
<?php
namespace test2;
class Test2Demo1
{
public function text2Demo1(): string
{
return '我是空間內(nèi)類的函數(shù): ' . __METHOD__;
}
}
<?php
namespace test2;
function test2Demo1(): string
{
return '我是空間內(nèi)的函數(shù): ' . __FUNCTION__;
}
子空間: PHP 命名空間允許指定層次化的命名空間的名稱,因此,命名空間的名字可以使用分層次的方式定義
<?php
namespace test3 {
function test31(): string
{
return "我是父級(jí)空間的方法" . __METHOD__;
}
echo "當(dāng)前空間: " . __NAMESPACE__, "<br>";
echo test31(), "<hr>";
echo '------------------調(diào)用下級(jí)空間的成員------------------<br>';
// namespace\test3One\test1() 和 \test3\test3One\test1() 也是一樣的效果
// namespace: 代指當(dāng)前空間,類似于class中的$this和self
echo "test3\\test3One空間的成員: ", test3One\test1(), "<br>";
}
namespace test3\test3One{
function test1(): string
{
return "我是子空間的方法" . __METHOD__;
}
echo "當(dāng)前空間: " . __NAMESPACE__, "<br>";
echo test1(), "<hr>";
echo '------------------調(diào)用下級(jí)空間的成員------------------<br>';
echo "test3\\test3One\\test3Two空間的成員: ", test3Two\test2(), "<br>";
echo '------------------調(diào)用上級(jí)空間的成員------------------<br>';
echo "test3空間的成員: ", \test3\test31(), "<br>";
}
namespace test3\test3One\test3Two{
function test2(): string
{
return "我是子空間的方法" . __METHOD__;
}
echo "當(dāng)前空間: " . __NAMESPACE__, "<br>";
echo test2(), "<hr>";
echo '------------------調(diào)用上級(jí)空間的成員------------------<br>';
echo "test3空間的成員: ", \test3\test31(), "<br>";
echo "test3\\test3One空間的成員: ", \test3\test3One\test1(), "<br>";
}
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)