首頁 php教程 php手册 自己练手写的模板引擎

自己练手写的模板引擎

Jun 06, 2016 pm 07:39 PM
引擎 範本 自己

自己练手写的模板引擎 使用方法: include(SITE_PATH./b/GyT.php); $t=new GyT(); $t-setGyiCharset(utf-8); $t-setFrontSeparator({@#); $t-setBackSeparator(#@}); //设置显示的文件名 $t-setInVtrParameter(a1, guoyong我是1); $t-setInVtrParameter(a2, g

自己练手写的模板引擎
使用方法:
include(SITE_PATH."/b/GyT.php");
$t=new GyT();
$t->setGyiCharset("utf-8");
$t->setFrontSeparator("{@#");
$t->setBackSeparator("#@}");
//设置显示的文件名
$t->setInVtrParameter("a1", "guoyong我是1");
$t->setInVtrParameter("a2", "guoyong我是2");
$t->setInVtrParameter("a3", "guoyong我是3");
$t->setInVtrParameter("a4", "guoyong我是4");
$t->setInVtrParameter("a5", "guoyong我是5");

$t->setInIfParameter("guoyong", 1);
$a=array(
array("Id"=>"1","Title"=>"测试一下1"),
array("Id"=>"2","Title"=>"测试一下2"),
array("Id"=>"3","Title"=>"测试一下3"),
array("Id"=>"4","Title"=>"测试一下4"),
array("Id"=>"5","Title"=>"测试一下5")
);

$b=array(
array("Id"=>"1","Title"=>"测试一下1"),
array("Id"=>"2","Title"=>"测试一下2"),
array("Id"=>"3","Title"=>"测试一下3"),
array("Id"=>"4","Title"=>"测试一下4"),
array("Id"=>"5","Title"=>"测试一下5")
);
$t->setInForParameter("netlist", $a);
$t->setInForParameter("netlist1", $b);
$FileName=SITE_PATH."/s/t/default/index1.html";
$t->setFile($FileName);
$t->parse();
echo $t->Out();

<?php
include(SYSTEM_PATH.'/b/GyIf.php');
include(SYSTEM_PATH.'/b/GyFor.php');

class GyT {
	private $_gyFile = "";
	private $_gyFrontSeparator = "{";
	private $_gyBackSeparator = "}";
	private $_gyiCharset;
	private $_gyInVar=array();
	private $_gyInFor=array();
	private $_gyInIf=array();
	private $_gyContent = "";
	private $_gyParameterArray;
		
	private function getContent()
	{
		if(isset($this->_gyContent))
		{
			return($this->_gyContent);
		}else
		{
			return(NULL);
		}
	}
	
	private function setContent($content)
	{
		$this->_gyContent = $content;
	}
	
	private function getGyiCharset()
	{
		if(isset($this->_gyiCharset))
		{
			return($this->_gyiCharset);
		}
		else
		{
			return(NULL);
		}
	}
	public function setGyiCharset($gyiCharset)
	{
		$this->_gyiCharset = $gyiCharset;
	}
	
	public function setFrontSeparator($gytemp) {
		$this->_gyFrontSeparator = $gytemp;
	}
	
	private function getFrontSeparator() {
		return $this->_gyFrontSeparator;
	}

	public function setBackSeparator($gytemp) {
		$this->_gyBackSeparator = $gytemp;
	}
	
	private function getBackSeparator() {
		return $this->_gyBackSeparator;
	}

	public function setFile($gyfile) {
		$this->_gyFile = $gyfile;
	}

	private function getFile() {
		return $this->_gyFile;
	}
	
	public function setInVtrParameter($ParameterName, $ParameterVale) {
		//判断键是否存在
		if (array_key_exists($ParameterName,$this->_gyInVar))
		{
			//已经存在
			$this->_gyInVar[$ParameterName]=$ParameterVale;
		}
		else
		{
			//不存在
			$tempA=array($ParameterName=>$ParameterVale);
			$tempB=$this->_gyInVar;
			$this->_gyInVar=array_merge($tempA,$tempB);
		}
	}
	
	public function setInIfParameter($ParameterName, $ParameterVale) {
		//判断键是否存在
		if (array_key_exists($ParameterName,$this->_gyInIf))
		{
			//已经存在
			$this->_gyInIf[$ParameterName]=$ParameterVale;
		}
		else
		{
			//不存在
			$tempA=array($ParameterName=>$ParameterVale);
			$tempB=$this->_gyInIf;
			$this->_gyInIf=array_merge($tempA,$tempB);
		}
	}
	
	public function setInForParameter($ParameterName, $ParameterVale) {
		if (array_key_exists($ParameterName,$this->_gyInFor))
		{
			//已经存在
			$this->_gyInFor[$ParameterName]=$ParameterVale;
		}
		else
		{
			//不存在
			$tempA=array($ParameterName=>$ParameterVale);
			$tempB=$this->_gyInFor;
			$this->_gyInFor=array_merge($tempA,$tempB);
		}
	}
	
	public function GyT() {
		
	}
	
	private function GYReadFile($filename)
	{
		$content=file_get_contents($filename);
		
		if(is_null($this->getGyiCharset())==TRUE)
		{
			$content = iconv($this->getGyiCharset(),"UTF-8//IGNORE",$content); 
		}
		return $content;
	}
	
	public function parse() {
		try {
			$this->setContent($this->GYReadFile($this->_gyFile));
			//处理标签
			$GySplitA=explode($this->_gyFrontSeparator, $this->_gyContent);
			
			if(count($GySplitA)<=1)
			{
				//没有需要处理的变量
			}
			else
			{
				
				for($i=1,$temp_count=count($GySplitA); $i<$temp_count; $i++) {
					$GySplitB=explode($this->_gyBackSeparator, $GySplitA[$i]);
					$this->_gyParameterArray[($i-1)]=$GySplitB[0];
				}
				$this->RepInclude();
				
				// 处理判断
				$this->RepIf();
				
				// 处理循环
				$this->RepFor();
				
				// 处理插件
				//$this->RepPlus();
				
				// 处理替换的标签
				$this->RepString();
			}
		} catch (Exception $e) {
			print $e->getMessage();
			exit;
		}
	}
	
	private function RepInclude(){
		$tempS=$this->_gyContent;
		$tempCountA=count($this->_gyParameterArray);
		$deletekey=array();
		for($i=0;$i<=$tempCountA;$i++)
		{
			if(substr_count($this->_gyParameterArray[$i],"include:")>0)
			{
				//获取包含的文件内容
				$tempPath=str_replace("include:","",$this->_gyParameterArray[$i]);
				$tempContent=$this->GYReadFile(SYSTEM_PATH.$tempPath);
				$tempS=str_replace($this->_gyFrontSeparator.$this->_gyParameterArray[$i].$this->_gyBackSeparator,$tempContent,$tempS);
				$deletekey[]=$this->_gyParameterArray[$i];
			}
		}
		$this->setContent($tempS);
	}
	
	private function RepString() {
		$tempS=$this->_gyContent;
		$tempParameterArray=$this->_gyInVar;
		$tempCountA=count($this->_gyParameterArray);
		$deletekey=array();
		for($i=0;$i<=$tempCountA;$i++)
		{
			//对变量循环,看看有没有符合的变量,符合的进行替换
			if(substr_count($this->_gyParameterArray[$i],":")==0)
			{
				foreach ($tempParameterArray as $key => $value) {
					if($key==$this->_gyParameterArray[$i])
					{
						$tempS=str_replace($this->_gyFrontSeparator.$key.$this->_gyBackSeparator,$value,$tempS);
						$deletekey[]=$key;
						$tempParameterArray=$this->gydeletearraykey($tempParameterArray,$key);		
					}
				}
			}
			
		}
		$this->setContent($tempS);
	}
	
	private function RepIf(){
		$tempS=$this->_gyContent;
		$GySplitA=explode($this->_gyFrontSeparator."endif:", $tempS);
		if(count($GySplitA)<=1)
		{
				//没有需要处理的变量
		}
		else
		{
			for($i=1,$temp_count=count($GySplitA); $i<$temp_count; $i++) {
				$GySplitF=explode($this->_gyFrontSeparator."endif:", $tempS);
				$mainkey="";
				$GySplitB=explode($this->_gyBackSeparator, $GySplitF[1]);
				$mainkey=$GySplitB[0];
				$tempGySplit=$GySplitF[0];
				$GySplitD=explode($this->_gyFrontSeparator."if:", $GySplitF[0]);
				$GySplitE=explode($this->_gyBackSeparator,$GySplitD[(count($GySplitD)-1)]);
				$key=$GySplitE[0];
				$tempSpStart="";
				$tempSpEnd="";
				$tempSpIf="";
				$tempMain_2=explode($this->_gyFrontSeparator."endif:".$mainkey.$this->_gyBackSeparator, $tempS);
							
				for($k=1;$k<count($tempMain_2);$k++)
				{
					$tempSpEnd=$tempSpEnd.$tempMain_2[$k].$this->_gyFrontSeparator."endif:".$mainkey.$this->_gyBackSeparator;
				}
				$tempSpEnd=substr($tempSpEnd,0,strlen($tempSpEnd)-strlen($this->_gyFrontSeparator."endif:".$mainkey.$this->_gyBackSeparator));
							
				//获取第一个
				$tempMain_3=explode($this->_gyFrontSeparator."if:".$key.$this->_gyBackSeparator, $tempMain_2[0]);
				$tempSpIf=$tempMain_3[(count($tempMain_3)-1)];
				for($k=0;$k<(count($tempMain_3)-1);$k++)
				{
					$tempSpStart=$tempSpStart.$tempMain_3[$k].$this->_gyFrontSeparator."if:".$key.$this->_gyBackSeparator;
				}
				$tempSpStart=substr($tempSpStart,0,strlen($tempSpStart)-strlen($this->_gyFrontSeparator."if:".$key.$this->_gyBackSeparator));
				foreach ($this->_gyInIf as $ifkey => $ifvalue) {
					if($mainkey==$ifkey)
					{
						//调用if类进行处理
						$igyif=new GyIf();
						$igyif->setTempValue($ifvalue);
						$igyif->setgyParameter($key);
						$igyif->settempSpStart($tempSpStart);
						$igyif->settempSpEnd($tempSpEnd);
						$igyif->settempSpIf($tempSpIf);
						$igyif->setgyFrontSeparator($this->_gyFrontSeparator);
						$igyif->setgyBackSeparator($this->_gyBackSeparator);
						$igyif->Parse();
						$tempS=$igyif->getContent();
					}
				}
			}
		}

		$this->setContent($tempS);
	}

	private function RepFor(){
		
		$tempS=$this->_gyContent;
		
		$GySplitA=explode($this->_gyFrontSeparator."endfor:", $tempS);
		if(count($GySplitA)<=1)
		{
				//没有需要处理的变量
		}
		else
		{
			for($i=1,$temp_count=count($GySplitA); $i<$temp_count; $i++) {
				$GySplitF=explode($this->_gyFrontSeparator."endfor:", $tempS);
				$mainkey="";
				$GySplitB=explode($this->_gyBackSeparator, $GySplitF[1]);
				$mainkey=$GySplitB[0];
				$tempGySplit=$GySplitF[0];
				$GySplitD=explode($this->_gyFrontSeparator."for:", $GySplitF[0]);
				$GySplitE=explode($this->_gyBackSeparator,$GySplitD[(count($GySplitD)-1)]);
				$key=$GySplitE[0];
				$tempSpStart="";
				$tempSpEnd="";
				$tempSpFor="";
				
				$tempMain_2=explode($this->_gyFrontSeparator."endfor:".$mainkey.$this->_gyBackSeparator, $tempS);	
				for($k=1;$k<count($tempMain_2);$k++)
				{
					$tempSpEnd=$tempSpEnd.$tempMain_2[$k].$this->_gyFrontSeparator."endfor:".$mainkey.$this->_gyBackSeparator;
				}
				$tempSpEnd=substr($tempSpEnd,0,strlen($tempSpEnd)-strlen($this->_gyFrontSeparator."endfor:".$mainkey.$this->_gyBackSeparator));
							
				//获取第一个
				$tempMain_3=explode($this->_gyFrontSeparator."for:".$key.$this->_gyBackSeparator, $tempMain_2[0]);
				$tempSpFor=$tempMain_3[(count($tempMain_3)-1)];
				for($k=0;$k<(count($tempMain_3)-1);$k++)
				{
					$tempSpStart=$tempSpStart.$tempMain_3[$k].$this->_gyFrontSeparator."for:".$key.$this->_gyBackSeparator;
				}
				$tempSpStart=substr($tempSpStart,0,strlen($tempSpStart)-strlen($this->_gyFrontSeparator."for:".$key.$this->_gyBackSeparator));
				foreach ($this->_gyInFor as $forkey => $forvalue) {
					if($mainkey==$forkey)
					{
						$igyfor=new GyFor();
						$igyfor->setTempValue($forvalue);
						$igyfor->setgyParameter($key);
						$igyfor->settempSpStart($tempSpStart);
						$igyfor->settempSpEnd($tempSpEnd);
						$igyfor->settempSpFor($tempSpFor);
						$igyfor->setgyFrontSeparator($this->_gyFrontSeparator);
						$igyfor->setgyBackSeparator($this->_gyBackSeparator);
						$igyfor->Parse();
						$tempS=$igyfor->getContent();
					}
				}
			}
		}
		$this->setContent($tempS);
	}
	
	private function gydeletearraykey($sArray,$key){
		$tempA=$sArray;
		if (array_key_exists($key,$tempA))
		{
			unset($tempA[$key]); 
		}
		return $tempA;
	}
	
	private function gydeletearrayvalue($sArray,$value){
		$tempA=$sArray;
		unset($tempA[array_search($value,$tempA)]);
		return $tempA;
	}
	
	private function gyshuffle($sArray)
	{
		$tempA=$sArray;
		$tempB=array();
		$i=0;
		foreach ($tempA as $key => $value) 
		{
			$tempB[$i]=$value;
			$i++;
		}
		return $tempB;
	}
	
	public function Out(){
		return $this->_gyContent;
	}
}
?>
登入後複製

<?php
class GyFor
{
	private $_content="";//返回值
	private $_gyFrontSeparator = "{";
	private $_gyBackSeparator = "}";
	//private $_gyParameter=array();//主体数组结构由6个变量组成,1主内容。2维度。3start主体。4end主体。5mainkey。6key
	private $_gyParameter="";//表达式
	// 循环前的字符串
	private $_tempSpStart="";
	// 循环后的字符串
	private $_tempSpEnd="";
	// 循环的字符串
	private $_tempSpFor="";
	
	private $_tempValue="";
	
	public function GyFor()
	{
		$this->_content="";
	}
	
	public function setgyFrontSeparator($gyFrontSeparator)
	{
		$this->_gyFrontSeparator=$gyFrontSeparator;
	}
	public function setgyBackSeparator($gyBackSeparator)
	{
		$this->_gyBackSeparator=$gyBackSeparator;
	}
	public function setTempValue($tempValue)
	{
		$this->_tempValue=$tempValue;
	}
	public function setgyParameter($gyParameter)
	{
		$this->_gyParameter=$gyParameter;
	}
	public function settempSpStart($tempSpStart)
	{
		$this->_tempSpStart=$tempSpStart;
	}
	public function settempSpEnd($tempSpEnd)
	{
		$this->_tempSpEnd=$tempSpEnd;
	}
	public function settempSpFor($tempSpFor)
	{
		$this->_tempSpFor=$tempSpFor;
	}
	
	public function Parse()
	{
		if(is_array($this->_tempValue)==true)
		{
			//判断数组维数
			$weidu=$this->arrayLevel($this->_tempValue);
			
			if($weidu==1)
			{
				//如果是1维数组,则直接替换就ok
				foreach ($this->_tempValue as $forkey => $forvalue) {
					$tkey=$this->_gyFrontSeparator.$this->_gyParameter.".".$forkey.$this->_gyBackSeparator;
					$this->_tempSpFor=str_replace($tkey, $forvalue, $this->_tempSpFor);
				}
				$this->_content=$this->_tempSpStart.$this->_tempSpFor.$this->_tempSpEnd;
			}
			elseif($weidu==2)
			{
				
				$tempS="";
				$tempT="";
				//如果是2维数组,则循环替换
				for($i=0,$tc=count($this->_tempValue,0);$i<$tc;$i++)
				{
					$tempT=$this->_tempSpFor;
					foreach ($this->_tempValue[$i] as $forkey => $forvalue) {
						$tkey=$this->_gyFrontSeparator.$this->_gyParameter.".".$forkey.$this->_gyBackSeparator;
						$tempT=str_replace($tkey, $forvalue, $tempT);
					}
					$tempS=$tempS.$tempT;
				}
				$this->_content=$this->_tempSpStart.$tempS.$this->_tempSpEnd;
			}
			else
			{
				$this->_content=$this->_tempSpStart.$this->_tempSpEnd;
			}
		}
		else
		{
			$this->_content=$this->_tempSpStart.$this->_tempSpEnd;
		}
	}
	
	/**
    * 返回数组的维度
    * @param [type] $arr [description]
    * @return [type]     [description]
    */
    function arrayLevel($arr)
    {
	    $al = array(0);
	    
	    $this->aL($arr,$al);
	    return max($al);
    }
	
	function aL($arr,&$al,$level=0)
	    {
		    if(is_array($arr)){
			    $level++;
			    $al[] = $level;
			    foreach($arr as $v)
			    {
			    	$this->aL($v,$al,$level);
			    }
		    }
	    }
	
	public function getContent()
	{
		return $this->_content;
	}
	
}
登入後複製

<?php
class GyIf
{
	private $_content="";//返回值
	private $_gyParameter="";//表达式
	// 循环前的字符串
	private $_tempSpStart="";
	// 循环后的字符串
	private $_tempSpEnd="";
	// 循环的字符串
	private $_tempSpIf="";
	private $_tempValue="";
	
	private $_gyFrontSeparator = "{";
	
	private $_gyBackSeparator = "}";
	
	public function GyIf()
	{
		$this->_content="";
	}
	public function setgyFrontSeparator($gyFrontSeparator)
	{
		$this->_gyFrontSeparator=$gyFrontSeparator;
	}
	public function setgyBackSeparator($gyBackSeparator)
	{
		$this->_gyBackSeparator=$gyBackSeparator;
	}
	public function setTempValue($tempValue)
	{
		$this->_tempValue=$tempValue;
	}
	public function setgyParameter($gyParameter)
	{
		$this->_gyParameter=$gyParameter;
	}
	public function settempSpStart($tempSpStart)
	{
		$this->_tempSpStart=$tempSpStart;
	}
	public function settempSpEnd($tempSpEnd)
	{
		$this->_tempSpEnd=$tempSpEnd;
	}
	public function settempSpIf($tempSpIf)
	{
		$this->_tempSpIf=$tempSpIf;
	}
	
	public function Parse()
	{
		$c_a=$this->_tempSpStart.$this->_tempSpIf.$this->_tempSpEnd;
		$c_b=$this->_tempSpStart.$this->_tempSpEnd;
		
		//对表达式进行分析 判断是否含有空格
		if(substr_count($this->_gyParameter," ")==0)
		{
			//如果不含有表达式,判断当前值的真假
			if(isset($this->_tempValue))
			{
				if($this->_tempValue==true)
				{
					$this->_content=$c_a;
				}
				else
				{
					$this->_content=$c_b;
				}
			}
			else
			{
				$this->_content=$c_b;
			}
		}
		else
		{
			$mainkey=explode(" ", $this->_gyParameter);
	
			if(count($mainkey)==2)
			{
				if($this->_tempValue==$mainkey[1])
				{
					$this->_content=$c_a;
				}
				else
				{
					$this->_content=$c_b;
				}
			}
			else
			{
				$key1=$this->_tempValue;
				$key2=$mainkey[1];//表达式
				$key3=$mainkey[2];
				//echo "<br>------------------<br>";
				//print_r($key2);
				//echo "<br>------------------<br>";
				switch ($key2) 
				{
					case "eq":
						if($key1==$key3)
						{
							$this->_content=$c_a;
						}
						else
						{
							$this->_content=$c_b;
						}
						break;
					case "=":
						if($key1==$key3)
						{
							//echo "<br>--------true----------<br>";
							$this->_content=$c_a;
						}
						else
						{
							//echo "<br>--------false----------<br>";
							$this->_content=$c_b;
						}
						break;
					case ">":
						if($key1 > $key3)
						{
							$this->_content=$c_a;
						}
						else
						{
							$this->_content=$c_b;
						}
						break;
					case ">=":
						if($key1 >= $key3)
						{
							$this->_content=$c_a;
						}
						else
						{
							$this->_content=$c_b;
						}
						break;
					case "<":
						if($key1 < $key3)
						{
							$this->_content=$c_a;
						}
						else
						{
							$this->_content=$c_b;
						}
						break;
					case "<=":
						if($key1 <= $key3)
						{
							$this->_content=$c_a;
						}
						else
						{
							$this->_content=$c_b;
						}
						break;
					default:
						
				}
			}
		}
	}
	
	public function getContent()
	{
		return $this->_content;
	}
}
登入後複製

<!DOCTYPE html>
<html>

	<head>
		<meta charset="utf-8" />
		<title>{@#a5#@}</title>
	</head>

	<body>
		{@#include:/s/t/default/head.html#@}
		<br /> 测试变量1 {@#a1#@}
		<br /> {@#include:/s/t/default/head.html#@}
		<br /> {@#a2#@}
		<br /> {@#a3#@}
		<br /> {@#a4#@}
		<br />
		<br /> {@#if:guoyong > 1#@}
		<br />1: {@#a4#@} {@#if:guoyong = 1#@}
		<br />1: {@#a4#@}
		<br /> {@#endif:guoyong#@}
		<br /> {@#endif:guoyong#@}
		<br /> {@#a4#@}
		<br /> {@#if:guoyong 1#@}
		<br />2: {@#a4#@}
		<br /> {@#endif:guoyong#@}
		<br />
		<br /> {@#if:guoyong 1#@}
		<br />3: {@#a4#@}
		<br /> {@#endif:guoyong#@}
		<br /> {@#include:/s/t/default/foot.html#@} {@#for:netlist#@} =====================
		<br>
		<a href="/article.jsp?articleid={@#netlist.Id#@}" title="{@#netlist.Title#@}">{@#netlist.Title#@}</a>
		<br> =============================
		<br> {@#for:netlist1#@}
		<br>
		<a href="/article.jsp?articleid={@#netlist1.Id#@}" title="{@#netlist1.Title#@}">{@#netlist1.Title#@}</a>
		<br> {@#endfor:netlist1#@} {@#endfor:netlist#@}

		<br /> **************************

		<br />
		<br />
		<br />
		<br /> {@#plus:test=fdsafdsafsdafsadfdsfdsafdas#@}
		<br />
		<br />
		<br />
		<br />
		<br />
	</body>

</html>
登入後複製

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PHP電子郵件範本:客製化和個人化您的郵件內容。 PHP電子郵件範本:客製化和個人化您的郵件內容。 Sep 19, 2023 pm 01:21 PM

PHP電子郵件範本:客製化和個人化您的郵件內容隨著電子郵件的普及和廣泛應用,傳統的郵件範本已經無法滿足人們對個人化和客製化郵件內容的需求。現在,我們可以透過使用PHP程式語言來創建客製化和個人化的電子郵件範本。本文將為您介紹如何使用PHP來實現這一目標,並提供一些具體的程式碼範例。一、建立郵件範本首先,我們需要建立一個基本的郵件範本。這個模板可以是一個HTM

PPT蒙版該怎麼添加 PPT蒙版該怎麼添加 Mar 20, 2024 pm 12:28 PM

關於PPT蒙版,很多人肯定對它很陌生,一般人做PPT不會將牠吃透,而是湊活著可以做出來自己喜歡的就行,所以很多人都不知道PPT蒙版到底是什麼意思,也不知道這個蒙版有什麼作用,甚至更不知道它可以讓圖片變得不再那麼單調,想要學習的小伙伴們快來了學習學習,為你的PPT圖片上添上點吧PPT蒙版吧,讓它不再單調了。那麼,PPT蒙版該怎麼添呢?請往下看。 1.首先我們開啟PPT,選擇一張空白的圖片,之後右鍵點選【設定背景格式】,純色選擇顏色就行。 2.點選【插入】,藝術字,輸入字3.點選【插入】,點選【形狀】

C++ 模板特化的影響對於函式重載與重寫 C++ 模板特化的影響對於函式重載與重寫 Apr 20, 2024 am 09:09 AM

C++模板特化影響函式重載與重寫:函式重載:特化版本可提供特定型別不同的實現,進而影響編譯器選擇呼叫的函式。函數重寫:衍生類別中的特化版本將覆寫基底類別中的模板函數,影響衍生類別物件呼叫函數時的行為。

引擎格局變革:三缸引擎挑戰六缸和八缸統治地位 引擎格局變革:三缸引擎挑戰六缸和八缸統治地位 Oct 08, 2023 pm 10:57 PM

10月8日消息,美國汽車市場正在經歷一場引擎蓋下的變革,以前備受喜愛的六缸和八缸動力發動機正逐漸失去統治地位,而三缸發動機則嶄露頭角。 10月8日的消息顯示,美國汽車市場正在經歷引擎蓋下的變化。過去備受喜愛的六缸和八缸動力引擎正在逐漸失去統治地位,而三缸引擎則開始嶄露頭角在大多數人的印像中,美國人鍾情於大排量車型,而"美式大V8"一直是美國車的代名詞。然而,根據外媒近期公佈的數據,美國汽車市場的格局正在發生巨大變化,引擎蓋下的戰鬥正愈演愈烈。據了解,在2019年之前,美

C++中的模板元程式設計面試常見問題 C++中的模板元程式設計面試常見問題 Aug 22, 2023 pm 03:33 PM

C++是一門廣泛應用於各領域的程式語言,其模板元程式設計是一種高階程式技術,可讓程式設計師在編譯時對類型和數值進行變換。在C++中,模板元程式設計是一個廣泛討論的話題,因此在面試中,與此相關的問題也是相當常見的。以下是一些可能會被問到的C++中的模板元程式設計面試常見問題。什麼是模板元程式設計?模板元程式設計是一種在編譯時操作類型和數值的技術。它使用模板和元函數來根據類型和值生成

實測英偉達AI遊戲引擎:與NPC即時聊天,中文流暢爆了 實測英偉達AI遊戲引擎:與NPC即時聊天,中文流暢爆了 Mar 04, 2024 am 09:40 AM

黃院士在《Cyber​​punk2077》裡搞的智能NPC,已經飆起中文了?量子位的一手體驗,親眼見證了NPC們流利地用中英雙語對話,表情動作自然,口型也能對上……如果不是眼前就有一塊屏幕,真的會有種身臨其境之感。今年的CES展上,英偉達用智慧引擎AvatarCloudEngine(ACE),讓遊戲NPC「活」了起來,引起了不小的震撼。 △CES上展示的智慧NPC使用ACE,遊戲中的角色可以與玩家進行逼真的語音對話,同時展現出生動的表情和肢體動作,而無需事先準備劇本。亮相當時,就有育碧、騰訊、網易、米哈遊等國

Vue中如何實現圖片的模板和蒙版處理? Vue中如何實現圖片的模板和蒙版處理? Aug 17, 2023 am 08:49 AM

Vue中如何實現圖片的模板和蒙版處理?在Vue中,我們經常需要對圖片進行一些特殊的處理,例如添加模板效果或加上蒙版。本文將介紹如何使用Vue實現這兩種圖片處理效果。一、圖片模板處理在使用Vue處理圖片時,我們可以利用CSS的filter屬性來實現模板效果。 filter屬性為元素添加圖形效果,其中的brightness濾鏡可以改變圖片的亮度。我們可以透過改變

Flask-Bootstrap:為Flask應用程式新增模板 Flask-Bootstrap:為Flask應用程式新增模板 Jun 17, 2023 pm 01:38 PM

Flask-Bootstrap:為Flask應用程式添加模板Flask是一個輕量級的PythonWeb框架,它提供了一個簡單而靈活的方式來建立網路應用程式。它是一款非常受歡迎的框架,但它的預設模板功能有限。若要建立富有吸引力的使用者介面,需使用其他框架或函式庫。這就是Flask-Bootstrap的用武之地。 Flask-Bootstrap是一個基於Twitter

See all articles