PHP의 사용자 정의 템플릿 엔진을 위한 샘플 코드 공유

黄舟
풀어 주다: 2023-03-07 06:18:02
원래의
1593명이 탐색했습니다.

이 글에서는 PHP템플릿 엔진에 대해 자세히 소개하겠습니다. 매우 좋은 참조 값을 가지고 있습니다. 아래 에디터로 살펴보겠습니다

앞의 말

대부분의 프로젝트 팀에서는 웹 프로그램을 개발할 때 이런 과정이 발생합니다. 문서 제출 계획 후 즉, 프론트엔드 엔지니어가 웹사이트의 모델 모습을 만들어 백엔드 엔지니어에게 넘겨주었고, 백엔드 엔지니어는 백엔드 코드를 사용하여 프로그램 로직을 구현하고 그 모습을 사용했습니다. 그런 다음 프로젝트는 추가 개선을 위해 프런트엔드 엔지니어에게 반환됩니다. 이런 식으로 프로젝트는 백엔드 엔지니어와 프론트엔드 엔지니어 사이를 여러 번 오갈 수 있습니다. 백엔드 엔지니어가 관련된 HTML 태그를 방해하지 않으므로 프런트엔드 코드와 백엔드 코드를 혼합할 필요가 없습니다. 프론트엔드 엔지니어는 구성 파일, 동적 블록 및 기타 인터페이스 부분만 필요하며 복잡한 백엔드 코드를 건드릴 필요가 없습니다. 따라서 현재로서는 좋은 템플릿 지원을 갖추는 것이 중요합니다. 이번 글에서는 PHP의 템플릿 엔진에 대해 자세히 소개하겠습니다

개요

웹사이트 템플릿이란 무엇인가요? 정확하게 말하면 웹사이트 페이지 템플릿을 의미합니다. 즉, 각 페이지는 구조, 스타일,

페이지 레이아웃

을 모두 포함하는 템플릿일 뿐이며, 웹 콘텐츠 제작을 위한 템플릿이기도 합니다. 기존 웹페이지프레임으로. 페이지 스타일을 일관되게 유지하기 위해 템플릿의 원본 콘텐츠를 서버측 데이터베이스의 동적 콘텐츠로 대체할 수 있습니다. PHP는 서버측에서 실행되는 HTML 내장 스크립트 언어이므로 대부분의 웹용 PHP로 개발된 애플리케이션의 초기 개발 템플릿은 혼합 계층 데이터 프로그래밍입니다. MVC 디자인 패턴은 프로그램 애플리케이션 로직과 웹 페이지 렌더링 로직을 강제로 분리할 수 있지만 애플리케이션의 입력, 처리 및 출력만 분리합니다. 웹 페이지 렌더링 로직(뷰)도 HTML 코드 및 PHP 프로그램과 강력하게 결합됩니다. . PHP 스크립트 작성자는 웹 디자이너이자 PHP 개발자여야 합니다

웹사이트의 페이지 디자인과 PHP 애플리케이션을 거의 완전히 분리할 수 있는 솔루션이 많이 있습니다. 이러한 솔루션을 "템플릿 엔진"이라고 하며 계층적 분리 부족으로 인한 어려움을 점차적으로 제거하고 있습니다. 템플릿 엔진의 목적은 위에서 언급한 논리적 분리 기능을 달성하는 것입니다. 이를 통해 프로그램 개발자는 데이터 제어 또는 기능 달성에 집중할 수 있습니다. 따라서 템플릿 엔진은 회사의 웹 개발팀이 사용하기에 매우 적합하며, 누구나 자신의 전문 지식을 발휘할 수 있습니다.

템플릿 엔진 기술의 핵심은 비교적 간단합니다. 프런트 엔드 페이지를 템플릿 파일로 지정하고 데이터베이스 출력, 사용자 상호 작용 등과 같은 이 템플릿 파일의 동적 콘텐츠를 특수 "구분 기호"를 사용하여 포함된 "

변수

"로 정의하면 됩니다. 그런 다음 템플릿 파일의 해당 위치에 배치합니다. 사용자가 탐색하면 PHP 스크립트 프로그램에 의해 템플릿 파일이 열리고 템플릿 파일에 정의된 변수가 대체됩니다. 이런 식으로 템플릿의 특수 변수가 다른 동적 콘텐츠로 대체되면 필요한 페이지가 출력됩니다. 현재 PHP에 적용할 수 있는 성숙한 템플릿이 많이 있습니다(예: Smarty, PHPLIB, IPB 수십 개가 더 있습니다. PHP로 작성된 이러한 템플릿 엔진을 사용하면 코드 컨텍스트를 더 명확하게 만들고 구조를 더 합리적으로 만들 수 있습니다. 또한 웹 사이트 유지 관리 및 업데이트를 더 쉽게 만들고 더 나은 개발 환경을 조성하며 개발 및 디자인 작업을 더 쉽게 결합할 수 있습니다. 그러나 가장 적합하거나 완벽한 PHP 템플릿은 없습니다. PHP 템플릿은 대중적인 것이고 특정 사람을 위해 개발되지 않았기 때문입니다. 템플릿의 특성과 용도에 대한 명확한 이해를 바탕으로 템플릿의 장단점을 충분히 이해할 수 있다면 템플릿 엔진을 사용할지, 어떤 템플릿 엔진을 사용할지 알 수 있습니다.

템플릿 맞춤화 엔진 클래스

템플릿 엔진의 작동 메커니즘을 더 잘 파악하고 Smarty 학습을 준비할 수 있는 템플릿 엔진을 사용자 정의합니다. 더 중요한 것은 자신만의 PHP 템플릿 엔진이 고정되어 있지 않으며 프로젝트의 필요에 따라 사용자 정의할 수 있다는 것입니다

다음 예에서는 앞서 소개한 템플릿 엔진 개념을 통해 자신만의 PHP 템플릿 엔진이 생성됩니다. 템플릿의 기본 기능을 처리하는 데 사용할 수 있는 템플릿 엔진입니다. 예: 변수 대체,

분기 구조

, 배열 루프 순회, 서로 중첩된 템플릿 등은 아래와 같습니다.

<?php
 /**
  file: mytpl.class.php 类名为MyTpl是自定义的模板引擎
  通过该类对象加载模板文件并解析,将解析后的结果输出 
 */
 class Mytpl {
  public $template_dir = &#39;templates&#39;;  //定义模板文件存放的目录 
  public $compile_dir = &#39;templates_c&#39;;  //定义通过模板引擎组合后文件存放目录
  public $left_delimiter = &#39;<{&#39;;   //在模板中嵌入动态数据变量的左定界符号
  public $right_delimiter = &#39;}>&#39;;   //在模板中嵌入动态数据变量的右定界符号
  private $tpl_vars = array();    //内部使用的临时变量
  /** 
   将PHP中分配的值会保存到成员属性$tpl_vars中,用于将模板中对应的变量进行替换 
   @param string $tpl_var 需要一个字符串参数作为关联数组下标,要和模板中的变量名对应 
   @param mixed $value  需要一个标量类型的值,用来分配给模板中变量的值  
  */
  function assign($tpl_var, $value = null) { 
   if ($tpl_var != &#39;&#39;)     
    $this->tpl_vars[$tpl_var] = $value;
  }
  /** 
   加载指定目录下的模板文件,并将替换后的内容生成组合文件存放到另一个指定目录下
   @param string $fileName 提供模板文件的文件名            
  */
   function display($fileName) { 
   /* 到指定的目录中寻找模板文件 */
   $tplFile = $this->template_dir.&#39;/&#39;.$fileName; 
   /* 如果需要处理的模板文件不存在,则退出并报告错误 */
   if(!file_exists($tplFile)) {     
    die("模板文件{$tplFile}不存在!");
   }
   /* 获取组合的模板文件,该文件中的内容都是被替换过的 */
   $comFileName = $this->compile_dir."/com_".$fileName.&#39;.php&#39;; 
   /* 判断替换后的文件是否存在或是存在但有改动,都需要重新创建 */
   if(!file_exists($comFileName) || filemtime($comFileName) < filemtime($tplFile)) {
    /* 调用内部替换模板方法 */
    $repContent = $this->tpl_replace(file_get_contents($tplFile)); 
    /* 保存由系统组合后的脚本文件 */
    file_put_contents($comFileName, $repContent);
   }
   /* 包含处理后的模板文件输出给客户端 */
   include($comFileName);     
  }
  /** 
   内部使用的私有方法,使用正则表达式将模板文件&#39;<{ }>&#39;中的语句替换为对应的值或PHP代码 
   @param string $content 提供从模板文件中读入的全部内容字符串 
   @return $repContent   返回替换后的字符串
  */
  private function tpl_replace($content) {
   /* 将左右定界符号中,有影响正则的特殊符号转义 例如,<{ }>转义\<\{ \}\> */
   $left = preg_quote($this->left_delimiter, &#39;/&#39;);
   $right = preg_quote($this->right_delimiter, &#39;/&#39;);
   /* 匹配模板中各种标识符的正则表达式的模式数组 */
   $pattern = array(  
    /* 匹配模板中变量 ,例如,"<{ $var }>" */
    &#39;/&#39;.$left.&#39;\s*\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*&#39;.$right.&#39;/i&#39;,  
    /* 匹配模板中if标识符,例如 "<{ if $col == "sex" }> <{ /if }>" */
    &#39;/&#39;.$left.&#39;\s*if\s*(.+?)\s*&#39;.$right.&#39;(.+?)&#39;.$left.&#39;\s*\/if\s*&#39;.$right.&#39;/ies&#39;,
    /* 匹配elseif标识符, 例如 "<{ elseif $col == "sex" }>" */
    &#39;/&#39;.$left.&#39;\s*else\s*if\s*(.+?)\s*&#39;.$right.&#39;/ies&#39;, 
    /* 匹配else标识符, 例如 "<{ else }>" */
    &#39;/&#39;.$left.&#39;\s*else\s*&#39;.$right.&#39;/is&#39;, 
    /* 用来匹配模板中的loop标识符,用来遍历数组中的值, 例如 "<{ loop $arrs $value }> <{ /loop}>" */
    &#39;/&#39;.$left.&#39;\s*loop\s+\$(\S+)\s+\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*&#39;.$right.&#39;(.+?)&#39;.$left.&#39;\s*\/loop\s*&#39;.$right.&#39;/is&#39;,
    /* 用来遍历数组中的键和值,例如 "<{ loop $arrs $key => $value }> <{ /loop}>" */
    &#39;/&#39;.$left.&#39;\s*loop\s+\$(\S+)\s+\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*=>\s*\$(\S+)\s*&#39;.$right.&#39;(.+?)&#39;.$left.&#39;\s*\/loop \s*&#39;.$right.&#39;/is&#39;, 
    /* 匹配include标识符, 例如,&#39;<{ include "header.html" }>&#39; */
    &#39;/&#39;.$left.&#39;\s*include\s+[\"\&#39;]?(.+?)[\"\&#39;]?\s*&#39;.$right.&#39;/ie&#39;     
   );
   /* 替换从模板中使用正则表达式匹配到的字符串数组 */
   $replacement = array( 
    /* 替换模板中的变量 <?php echo $this->tpl_vars["var"]; */
    &#39;<?php echo $this->tpl_vars["${1}"]; ?>&#39;,  
    /* 替换模板中的if字符串 <?php if($col == "sex") { ?> <?php } ?> */
    &#39;$this->stripvtags(\&#39;<?php if(${1}) { ?>\&#39;,\&#39;${2}<?php } ?>\&#39;)&#39;,  
    /* 替换elseif的字符串 <?php } elseif($col == "sex") { ?> */
    &#39;$this->stripvtags(\&#39;<?php } elseif(${1}) { ?>\&#39;,"")&#39;, 
    /* 替换else的字符串 <?php } else { ?> */
    &#39;<?php } else { ?>&#39;, 
    /* 以下两条用来替换模板中的loop标识符为foreach格式 */
    &#39;<?php foreach($this->tpl_vars["${1}"] as $this->tpl_vars["${2}"]) { ?>${3}<?php } ?>&#39;, 
    &#39;<?php foreach($this->tpl_vars["${1}"] as $this->tpl_vars["${2}"] => $this->tpl_vars["${3}"]) { ?>${4}<?php } ?>&#39;, 
    /*替换include的字符串*/
    &#39;file_get_contents($this->template_dir."/${1}")&#39;    
   );
   /* 使用正则替换函数处理 */
   $repContent = preg_replace($pattern, $replacement, $content);  
   /* 如果还有要替换的标识,递归调用自己再次替换 */
   if(preg_match(&#39;/&#39;.$left.&#39;([^(&#39;.$right.&#39;)]{1,})&#39;.$right.&#39;/&#39;, $repContent)) {  
    $repContent = $this->tpl_replace($repContent);    
   } 
   /* 返回替换后的字符串 */
   return $repContent;          
  }
   /**
   内部使用的私有方法,用来将条件语句中使用的变量替换为对应的值
   @param string $expr  提供模板中条件语句的开始标记   
   @param string $statement 提供模板中条件语句的结束标记 
   @return strin    将处理后的条件语句相连后返回 
  */
  private function stripvtags($expr, $statement=&#39;&#39;) {
   /* 匹配变量的正则 */
   $var_pattern = &#39;/\s*\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*/is&#39;; 
   /* 将变量替换为值 */
   $expr = preg_replace($var_pattern, &#39;$this->tpl_vars["${1}"]&#39;, $expr); 
   /* 将开始标记中的引号转义替换 */
   $expr = str_replace("\\\"", "\"", $expr);
   /* 替换语句体和结束标记中的引号 */
   $statement = str_replace("\\\"", "\"", $statement); 
   /* 将处理后的条件语句相连后返回 */
   return $expr.$statement;        
  }
 }
?>

在Mytpl类中声明的多个方法中,除被封装过的方法之外,只有两个公有方法assign()和display()在创建对象以后可以被凋用。其中assign()方法用来将PHP脚本中的数据分配给模板中对应的变量,display()方法则用来将特定的templates目录下的模板文件加载到PHP脚本中。同时将模板文件中使用“<{”和“>>”标记声明的自定义模板语句,匹配出来并替换成相对应的PHP语法格式,然后将替换后的内容保存在特定的templates_c目录下。在运行时还要编译成一个非模板技术的PHP文件,并将其以模板文件名加上“com_”前缀和“.php”的扩展名形式保存。再通过include()函数将处理后的模板文件包含,并使用PHP解析后发送给客户端

使用模板引擎

使用自定义的模板引擎比较容易,都是自己定义的语法格式。但要记住,所有流行的模板引繁解决方案都遵循同样的一组相同的核心实现原则,就是与编程语言一样,学习了一种语言就可以更容易地掌握其他语言。使用模板引擎最主要的原因就是将前端工程师和后端工程师的工作分开,所以模板引擎不仅后端工程师需要使用,前端工程师也需要使用

1、后端工程师对模板引擎的使用

在PHP脚本中包含模板引擎类所在的文件。如下所示:

require("mytpl.class.php");    //包含模板引擎类,相当于模板引擎安装
로그인 후 복사

创建模板引擎类的对象并对一些成员属性进行初始化赋值。如下所示:

$tpl=new MyTpl(); //创建模板引擎类的对象,也可以根据参数对成员初始化

将动态数据(包括标量和数组类型的数据,例如从数据库的表中获得的数据数组)使用模板引擎对象中的assign()方法分配给模板文件,这个方法可以使用多次,将任意多个变量分配给模板。如下所示:

$tpl->assign("var","this is a value"); //可以分配标量类型数据,可以使用多次
$tpl->assign("arr",array(array(1,2),array("a","b"))); //也可以分配数组包括多维数组
로그인 후 복사

在PHP脚本中通过调用模板对象中的display()方法,并将模板文件名作为参数传入,就会加载指定目录中对应的模板文件到PHP脚本中。再通过模板引擎中的替换方法对模板中自定义的语法进行解析,然后输出处理后的模板。如下所示:

$tpl->display("test.tpl");    //参数“test.tpl”为特定目录下的模板文件
로그인 후 복사

2、前端工程师对模板引擎的使用

前端工程师需要将编写的模板文件存放到指定的目录中,这个目录是通过在模板对象中使用$template_dir属性指定的,默认的设置是当前目录下的“templates”目录。另外,模板文件的命名以及后缀名的设置可以随意,例如index.tpl、test.htm、header.tp;等

模板文件是通过使用HTML、CSS以及javascript等Web前台语言以编写的纯静态负而。但可以在模板文件中使用“<{”和“}>”两个分隔符中间定义一个变量(类似PHP中的变量格式),该变量可以接受并输出由PHP脚本中分配过来的动态数据。在模板中使用的“<{”和“}>”两个分隔符对,也可以根据个人爱好在模板引擎类中修改。如下所示:

姓名:<{$name}>,年龄:<{$age}>,性别:<{$sex}> //模板中使用占位符

如果在PHP脚本中是将数组分配给模板,也可以在模板中进行遍历,还可以通过嵌套的方式遍历多维数组。使用的是在模板引擎中定义的“<{loop}>”标记对,使用的方式和PHP中foreach结构的语法格式相似。如下所示:

<{loop $arr $value }>     //遍历数组$arr中的元素值
 数组中的元素值<{$value}>   //每次遍历输出元素中的值
<{/loop}>        //在模板中遍历数组的结束标记
<{loop $arr $key=>$value }>   //遍历数组$arr中的元素下标和元素值
 数组中的元素键<{$key}>    //每次遍历输出元素中的下标
 数组中的元素值<{$value}>   //每次遍历输出元素中的值
<{/loop}>        //在模板中遍历数组的结束标记
<{loop $arr $value }>     //遍历数组$arr中的元素值
 <{loop $arr $data }>    //使用嵌套标记遍历二维数组
  数组中的元素值<{$value}>  //每次遍历输出元素中的值
 <{/loop}>       //在模板中遍历数组的内层结束标记
<{/loop}>        //在模板中遍历数组的外层结束标记
로그인 후 복사

模板引擎还可以解析在模板文件中使用特殊标记编写的分支结构,语法风格也是和PHP的分支结构类似。是通过在模板文件中使用“<{if}>”标记对实现选择结构,也可以实现多路分支和嵌套分支的选择结构。如下所示: 

<{if($var=="red")}>
 <p style="color:red">这是“红色”的字</p>
<{elseif($var=="green")}> 
 <p style="color:green">这是“绿色”的字</p>
<{else}>
 <{if($size=20)}>
  <p style="font-size:20">这是“20px”大小的字</p>
 <{/if}>
<{/if}>
로그인 후 복사

在自定义的模板引擎中,也添加了在模板文件中包含其他模板文件的功能。可以使用“<{include‘子模板文件名'}>”标记将子模板包含到当前模板中,还支持在子模板中再次包括另外的子模板。如下所示:

<{include &#39;other.tpl&#39; }>
로그인 후 복사

使用示例分析

通过在程序中加载模板引擎可以将前端语言与后端语言的代码分开。首先在PHP程序中获取数据库中存储的数据,再通过加载模板引擎将数据分配出去,然后将模板文件再通过模板引擎加载并处理后输出。所以PHP程序只是创建动态数据,加载模板引擎并将动态数据分配给模板,完成了PHP程序的工作。而模板的设汁也只需要前端工程师独立完成,使用HTML、CSS及javascript等前台页面设计语言编写。另外,在模板文件中还需要使用模板引擎可以解析的标记,将PHP中分配过来的动态数据在模板中引用

1、数据库的设计

假设数据库服务器在“localhost”主机上,连接的用户名和密码分别为“admin”和“123456”,在该服务器上创建一个名为“mydb”的数据库,并在该数据库中创建一个名为“User”的用户表。创建该表的SQL査询语句如下所示:

CREATE TABLE User(
 id SMALLINT(3) NOT NULL AUTO_INCREMENT,
 name VARCHAR(10) NOT NULL DEFAULT &#39;&#39;,
 sex VARCHAR(4) NOT NULL DEFAULT &#39;&#39;,
 age SMALLINT(2) NOT NULL DEFAULT &#39;0&#39;,
 email VARCHAR(20) NOT NULL DEFAULT &#39;&#39;,
 PRIMARY KEY (id)
);
로그인 후 복사

用户表User创建完成以后,接着可以向该表中插入一些数据作为示例演示使用,SQL查询语句如下所示:

INSERT INTO User (name,sex,age,email) VALUES 
("a","男",27,"a@a.com"),
("b","女",22,"b@b.com"),
("c","女",30,"c@c.com"),
("d","女",24,d@d.com);
로그인 후 복사

2、模板的设计

模板的设计不要出现任何的PHP代码,可以由前端人员来完成。在自定义的模板引擎中,规定了要到指定的目录中去寻找模板文件,这个特定的目录可以在创建模板引擎对象时指定,也可以使用默认的目录设置,默认可以将模板文件存放在当前目录中的“templates”目录下。本例共需要三个模板文件main.tpl、header.tpl和footer.tpl,都存放在这个默认的目录设置中。这三个模板文件的代码如下所示:

模板的头部文件header.tpl

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title> <{$title}> </title>
</head>
<body>
로그인 후 복사

模板的尾部文件footer.tpl

  <p style="width:200px;margin: 0 auto;">##### <{$author}> #####</p>  
 </body>
</html>
로그인 후 복사

主模板文件main.tpl

<{include &#39;header.tpl&#39;}>
 <table border="1" align="center" width="500">
  <{ loop $users $user }>
   <tr> 
    <{loop $user $u }>

      <{if $u == "男" }>
       <td style="color:green">
      <{elseif $u == "女"}>
       <td style="color:red">
      <{else}>
       <td>
      <{/if}>

       <{$u}></td>    
    <{/loop}>
   </tr>
  <{/loop}>
 </table>
<{include &#39;footer.tpl&#39;}>
로그인 후 복사

文件main.tpl是主模板文件,在该文件中使用<{include"header.tpl"}>和<{include"footer.tpl"}>两个标记分别在该文件的顶部和底部,将独立的头部和尾部模板文件包含到这个主模板文件中。并在该文件中使用<{tableName}>标记获取从PHP中动态分配过来的表名,以及使用双层<{loop}>标记嵌套,遍历从PHP中动态分配过来的在数据库中获取到的二维数组$Users,还在<{loop}>标记中使用条件选择标记<{if}>组合,将数据中性别为“男”的表格背景设置为红色和一些其他判断。被包含进来的头部模板文件header.tpl和尾部模板文件footer.tpl也同样可以获取从PHP中动态分配给模板的数据

3、PHP程序设计

通过模板引擎的使用,PHP程序员在编写代码时,只需要PHP一种语言就可以了,不用再去使用HTML、CSS以及javascript等页面设计语言完成前端的工作了。下面是一个文件名为index.php的PHP脚本文件,和模板引擎类所在的文件mytpl_class.php在同一个目录下。代码如下所示:

<?php
 //包含模板引擎类
 include "mytpl.class.php";
 //创建模板引擎对象
 $tpl = new Mytpl;
 //连接数据库
 $pdo = new PDO("mysql:host=localhost;dbname=mydb", "admin", "123456");
 //执行SQL语句
 $stmt = $pdo -> prepare("select id, name, sex,age,email from User order by id");
 $stmt ->execute();
 $data = $stmt -> fetchAll(PDO::FETCH_ASSOC);
 //这是从数据库获取的动态数据,需要在模板中显示
 $tpl->assign(&#39;title&#39;,"自定义模板引擎");$tpl->assign(&#39;auto&#39;,"小火柴");
 $tpl->assign(&#39;users&#39;,$data);
 $tpl -> display("main.tpl");
?>
로그인 후 복사

在上面的PHP脚本文件中,通过PDO对象连接MySQL服务器,并获取用户表User中的全部记录,并以PHP的二维数组变量形式保存在变量data中。接着使用包含进来的当前目录下的“mytplclss.php”文件,创建并初始化模板引擎类的对象data中。接着使用包含进来的当前目录下的“mytplclss.php”文件,创建并初始化模板引擎类的对象tpl。再通过该对象中的assign()方法向模板分配一些数据,然后使用该对象中的display()方法载入模板文件main.tpl。并将模板中标记的特殊变量替换为从PHP中分配的动态数据,处理完毕以后输出模板页面。页面的输出结果如下所示

限于各种不同的条件限制,比如时间、经验,做一个自定义的PHP模板引擎是非常困难的。其实,需要的并不是重新构造一个PHP模板,而是选择一个最贴近自己的PHP模板加以改造

위 내용은 PHP의 사용자 정의 템플릿 엔진을 위한 샘플 코드 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!