php静态方法调用非静态方法不可取
那天对这个主题比较感兴趣,于是就查了相关资料来记叙一下。不过,不知道自己写的到底有没有疏漏,所以,发到这里来给大家当靶子。如果您发现有什么叙述不正确的或不合理的,尽情拍砖――当然接受西红柿和鸡蛋。真理,只存在于辩论中。
---------------------------------------------
php中非静态方法的静态调用
参考资料:
1 Static method vs Non Static method?
http://bytes.com/topic/php/answers/495206-static-method-vs-non-static-method
2 PHP static method performance
http://vega.rd.no/articles/php-static-method-performance
php是个很诡异的语言。当然,这是对学习过C++或者Java等面向对象语言的人来说。
php
可以定义静态的方法,然后通过className::staticMethod()形式来调用。非静态的方法,当然通过
classObject->nonStaticMethod()使用。这个其他语言中也是如此,没什么大惊小怪的。可是,您能用
className::nonStaticMethod()调用非静态方法吗?这方面恐怕Java和C++要冷汗直流了。其实,php自己也是满脸黑线。
为什么这么说呢?
先来看看面向对象的静态和非静态。面向对象的语言中,都会支持静态方法。静态方法,属于类的固定资产的;非静态的方法,属于类的
实例的私有财产。在内存中,静态方法,对于整个类也就只存了这么一份;无论你new了多少个实例对象,它们共用的也就这么一份。对于非静态的就不一样了,
你new几个,内存就给你new几份。另外,静态方法内不可以调用非静态方法,非静态方法内却可以调用静态方法。这个就是静态和非静态的区别。
面向对象用static关键字来定义静态。未被标明是静态的方法,是不可以用类名加两个冒号的形式调用的。php和其它很有区别的一点就是这个了:php中未被标明是静态的方法,也可以用类名加两个冒号的形式调用。那么为什么php有这种语法?又为什么感到很无奈呢?
-----以下说明php无奈的故事据相关资料改编,已经过演义处理--------
php
之所以发展如此迅速,得益于它的速度。作为脚本语言,php追求高速度和简洁方便,所以选择了解释执行和使用过程方法。后来为了与国际接轨,引入了面向对
象的概念。而就是在引入这个面向对象的特征时,发生了一件令php目瞪口呆,最终无可奈何的事情。面向对象有个很重要的概念就是继承。在继承中,子类如果
覆盖父类的方法,同时需要调用父类的同名方法,该怎么办呢?php4版本提供了这样一种方法:parentClassName::method()。提出
此种方法之时,有识之士已经发现了问题:这个调用方式,不正是静态方法的调用方式吗?php4随即答曰:不碍事。类中使用时,可以判断此方式为子类正在调
用父类方法;非类中使用时,就判断为静态调用了。所需要的只是发现此种调用时查询一下方法映射就好了。其实,一想,也确实是那么回事。php4后来想想,
如果每次调用都检验一下此次调用是否合法,那多少也会影响性能,不如这个问题就交给程序员去控制吧:他们会知道只在类中使用此形式的调用的。唉,可惜天不
遂人愿。php4低估了程序员们的创造力!程序员们很快发现了这个方式,并且不余遗力地使用起来。许多集成的API也开始使用这种怪癖的方式。php无奈
了,随即在php5中引入了另一种方式,使用关键字parent来调用父类函数:parent::method()。但是,想要放弃php的非静态方法的
静态调用,着实是不再可能了。
--------------------
不过,话说回来,这种php的怪癖方式,有什么好处吗?性能和内存占用方面如何呢?
于
是我开始推理了:定义了一个非静态的方法,静态调用时,php首先转换此方法为静态定义,加载入静态内存区域,然后执行。通常一次业务,只使用一个业务处
理类中的一个方法,如果使用非静态定义,静态调用,内存中岂不是只加载了这个业务类中的一个方法,不是就实现了静态方法的按需加载吗?岂不是要省下一部分
内存?性能方面,无论是静态调用,还是对象调用,反正都是执行一个方法,性能还不是一样?并且静态调用非静态定义方法还省了一个new语句。嗯,嗯。这么
想的同时,手就开始写上了。
那么实际如何呢?我做了一个小测试。
<p> <span style="color: #000000;"> t</span> <span style="color: #000000;">::</span> <span style="color: #000000;">start();t</span> <span style="color: #000000;">::</span> <span style="color: #008080;">end</span> <span style="color: #000000;">(); </span> <span style="color: #008000;">//</span> <span style="color: #008000;">消除t类首次加载的影响</span> <span style="color: #008000;"> </span> <span style="color: #000000;">t</span> <span style="color: #000000;">::</span> <span style="color: #000000;">start(); model_profile_base</span> <span style="color: #000000;">::</span> <span style="color: #000000;">getBaseInfo(</span> <span style="color: #800080;">$uid</span> <span style="color: #000000;">); t</span> <span style="color: #000000;">::</span> <span style="color: #008080;">end</span> <span style="color: #000000;">(); t</span> <span style="color: #000000;">::</span> <span style="color: #000000;">start(); </span> <span style="color: #800080;">$model</span> <span style="color: #000000;"> </span> <span style="color: #000000;">=</span> <span style="color: #000000;"> </span> <span style="color: #0000ff;">new</span> <span style="color: #000000;"> model_profile_base(); </span> <span style="color: #800080;">$model</span> <span style="color: #000000;">-></span> <span style="color: #000000;">getBaseInfo(</span> <span style="color: #800080;">$uid</span> <span style="color: #000000;">); t</span> <span style="color: #000000;">::</span> <span style="color: #008080;">end</span> <span style="color: #000000;">(); </span> </p>
model_profile_base是处理基本资料的一个业务类,比较复杂,比较接近于项目中的业务处理实际。
下面是用到的计时和统计内存的t类的定义:
<p> <span style="color: #000000;"> </span> <span style="color: #000000;"></span> <span style="color: #000000;">php </span> <span style="color: #0000ff;">function</span> <span style="color: #000000;"> microtime_float() { </span> <span style="color: #0000ff;">list</span> <span style="color: #000000;">(</span> <span style="color: #800080;">$usec</span> <span style="color: #000000;">,</span> <span style="color: #000000;"> </span> <span style="color: #800080;">$sec</span> <span style="color: #000000;">) </span> <span style="color: #000000;">=</span> <span style="color: #000000;"> </span> <span style="color: #008080;">explode</span> <span style="color: #000000;">(</span> <span style="color: #000000;">"</span> <span style="color: #000000;"> </span> <span style="color: #000000;">"</span> <span style="color: #000000;">,</span> <span style="color: #000000;"> </span> <span style="color: #008080;">microtime</span> <span style="color: #000000;">()); </span> <span style="color: #0000ff;">return</span> <span style="color: #000000;"> ((</span> <span style="color: #0000ff;">float</span> <span style="color: #000000;">)</span> <span style="color: #800080;">$usec</span> <span style="color: #000000;"> </span> <span style="color: #000000;">+</span> <span style="color: #000000;"> (</span> <span style="color: #0000ff;">float</span> <span style="color: #000000;">)</span> <span style="color: #800080;">$sec</span> <span style="color: #000000;">); } </span> <span style="color: #0000ff;">class</span> <span style="color: #000000;"> t{ </span> <span style="color: #0000ff;">static</span> <span style="color: #000000;"> </span> <span style="color: #800080;">$start_time</span> <span style="color: #000000;">; </span> <span style="color: #0000ff;">static</span> <span style="color: #000000;"> </span> <span style="color: #800080;">$end_time</span> <span style="color: #000000;">; </span> <span style="color: #0000ff;">static</span> <span style="color: #000000;"> </span> <span style="color: #800080;">$start_memory</span> <span style="color: #000000;">; </span> <span style="color: #0000ff;">static</span> <span style="color: #000000;"> </span> <span style="color: #800080;">$end_memory</span> <span style="color: #000000;">; </span> <span style="color: #0000ff;">public</span> <span style="color: #000000;"> </span> <span style="color: #0000ff;">static</span> <span style="color: #000000;"> </span> <span style="color: #0000ff;">function</span> <span style="color: #000000;"> start() { self</span> <span style="color: #000000;">::</span> <span style="color: #800080;">$start_memory</span> <span style="color: #000000;"> </span> <span style="color: #000000;">=</span> <span style="color: #000000;"> memory_get_usage(); self</span> <span style="color: #000000;">::</span> <span style="color: #800080;">$start_time</span> <span style="color: #000000;"> </span> <span style="color: #000000;">=</span> <span style="color: #000000;"> microtime_float(); </span> <span style="color: #0000ff;">echo</span> <span style="color: #000000;"> </span> <span style="color: #000000;">'</span> <span style="color: #000000;"><br>Start @</span> <span style="color: #000000;">'</span> <span style="color: #000000;">.</span> <span style="color: #000000;">self</span> <span style="color: #000000;">::</span> <span style="color: #800080;">$start_time</span> <span style="color: #000000;">.</span> <span style="color: #000000;">'</span> <span style="color: #000000;">(</span> <span style="color: #000000;">'</span> <span style="color: #000000;">.</span> <span style="color: #000000;">self</span> <span style="color: #000000;">::</span> <span style="color: #800080;">$start_memory</span> <span style="color: #000000;">.</span> <span style="color: #000000;">'</span> <span style="color: #000000;">)|-------></span> <span style="color: #000000;">'</span> <span style="color: #000000;">; } </span> <span style="color: #0000ff;">public</span> <span style="color: #000000;"> </span> <span style="color: #0000ff;">static</span> <span style="color: #000000;"> </span> <span style="color: #0000ff;">function</span> <span style="color: #000000;"> </span> <span style="color: #008080;">end</span> <span style="color: #000000;">() { self</span> <span style="color: #000000;">::</span> <span style="color: #800080;">$end_time</span> <span style="color: #000000;"> </span> <span style="color: #000000;">=</span> <span style="color: #000000;"> microtime_float(); self</span> <span style="color: #000000;">::</span> <span style="color: #800080;">$end_memory</span> <span style="color: #000000;"> </span> <span style="color: #000000;">=</span> <span style="color: #000000;"> memory_get_usage(); </span> <span style="color: #0000ff;">echo</span> <span style="color: #000000;"> </span> <span style="color: #000000;">'</span> <span style="color: #000000;">End @</span> <span style="color: #000000;">'</span> <span style="color: #000000;">.</span> <span style="color: #000000;">self</span> <span style="color: #000000;">::</span> <span style="color: #800080;">$end_time</span> <span style="color: #000000;">.</span> <span style="color: #000000;">'</span> <span style="color: #000000;">(</span> <span style="color: #000000;">'</span> <span style="color: #000000;">.</span> <span style="color: #000000;">self</span> <span style="color: #000000;">::</span> <span style="color: #800080;">$end_memory</span> <span style="color: #000000;">.</span> <span style="color: #000000;">'</span> <span style="color: #000000;">) :</span> <span style="color: #000000;">'</span> <span style="color: #000000;">; </span> <span style="color: #0000ff;">echo</span> <span style="color: #000000;"> </span> <span style="color: #000000;">'</span> <span style="color: #000000;">|======= 共耗时:</span> <span style="color: #000000;">'</span> <span style="color: #000000;">.</span> <span style="color: #000000;">(self</span> <span style="color: #000000;">::</span> <span style="color: #800080;">$end_time</span> <span style="color: #000000;">-</span> <span style="color: #000000;">self</span> <span style="color: #000000;">::</span> <span style="color: #800080;">$start_time</span> <span style="color: #000000;">)</span> <span style="color: #000000;">.</span> <span style="color: #000000;">'</span> <span style="color: #000000;">,共用内存:</span> <span style="color: #000000;">'</span> <span style="color: #000000;">.</span> <span style="color: #000000;">(self</span> <span style="color: #000000;">::</span> <span style="color: #800080;">$end_memory</span> <span style="color: #000000;">-</span> <span style="color: #000000;">self</span> <span style="color: #000000;">::</span> <span style="color: #800080;">$start_memory</span> <span style="color: #000000;">); } } </span> </p>
这样,只调用一次,结果如下:
<p> <span style="color: #000000;"> Start @</span> <span style="color: #000000;">1287561987.1805</span> <span style="color: #000000;">(</span> <span style="color: #000000;">1008368</span> <span style="color: #000000;">)</span> <span style="color: #000000;">|-------></span> <span style="color: #008080;">End</span> <span style="color: #000000;"> @</span> <span style="color: #000000;">1287561987.1806</span> <span style="color: #000000;">(</span> <span style="color: #000000;">1008368</span> <span style="color: #000000;">) </span> <span style="color: #000000;">:|=======</span> <span style="color: #000000;"> 共耗时:</span> <span style="color: #000000;">3.2901763916016E-5</span> <span style="color: #000000;">,共用内存:</span> <span style="color: #000000;">0</span> <span style="color: #000000;"> Start @</span> <span style="color: #000000;">1287561987.1806</span> <span style="color: #000000;">(</span> <span style="color: #000000;">1008368</span> <span style="color: #000000;">)</span> <span style="color: #000000;">|-------></span> <span style="color: #008080;">End</span> <span style="color: #000000;"> @</span> <span style="color: #000000;">1287561987.1938</span> <span style="color: #000000;">(</span> <span style="color: #000000;">1586452</span> <span style="color: #000000;">) </span> <span style="color: #000000;">:|=======</span> <span style="color: #000000;"> 共耗时:</span> <span style="color: #000000;">0.013248920440674</span> <span style="color: #000000;">,共用内存:</span> <span style="color: #000000;">578084</span> <span style="color: #000000;"> Start @</span> <span style="color: #000000;">1287561987.1938</span> <span style="color: #000000;">(</span> <span style="color: #000000;">1586452</span> <span style="color: #000000;">)</span> <span style="color: #000000;">|-------></span> <span style="color: #008080;">End</span> <span style="color: #000000;"> @</span> <span style="color: #000000;">1287561987.1945</span> <span style="color: #000000;">(</span> <span style="color: #000000;">1586652</span> <span style="color: #000000;">) </span> <span style="color: #000000;">:|=======</span> <span style="color: #000000;"> 共耗时:</span> <span style="color: #000000;">0.00065183639526367</span> <span style="color: #000000;">,共用内存:</span> <span style="color: #000000;">200</span> <span style="color: #000000;"> </span> </p>
第二行是静态调用非静态方法,第三行是正常调用非静态方法。然后,我发现我的推理悲剧了。刷了好几次页面,统计结果在数量级上都差不多。静态调用非静态方法无论内存占用还是性能上都不敢恭维。这样的结果有点令人咂舌。
那么,再试一下循环执行多次的结果:
<p> <span style="color: #000000;"> t</span> <span style="color: #000000;">::</span> <span style="color: #000000;">start();t</span> <span style="color: #000000;">::</span> <span style="color: #008080;">end</span> <span style="color: #000000;">(); </span> <span style="color: #008000;">//</span> <span style="color: #008000;">消除t类首次加载的影响</span> <span style="color: #008000;"> </span> <span style="color: #000000;">t</span> <span style="color: #000000;">::</span> <span style="color: #000000;">start(); </span> <span style="color: #0000ff;">for</span> <span style="color: #000000;">(</span> <span style="color: #800080;">$i</span> <span style="color: #000000;">=</span> <span style="color: #000000;">0</span> <span style="color: #000000;">; </span> <span style="color: #800080;">$i</span> <span style="color: #000000;"> <span style="color: #000000;">1000</span> <span style="color: #000000;">;</span> <span style="color: #000000;">++</span> <span style="color: #800080;">$i</span> <span style="color: #000000;">) model_profile_base</span> <span style="color: #000000;">::</span> <span style="color: #000000;">getBaseInfo(</span> <span style="color: #800080;">$uid</span> <span style="color: #000000;">); t</span> <span style="color: #000000;">::</span> <span style="color: #008080;">end</span> <span style="color: #000000;">(); t</span> <span style="color: #000000;">::</span> <span style="color: #000000;">start(); </span> <span style="color: #800080;">$model</span> <span style="color: #000000;"> </span> <span style="color: #000000;">=</span> <span style="color: #000000;"> </span> <span style="color: #0000ff;">new</span> <span style="color: #000000;"> model_profile_base(); </span> <span style="color: #0000ff;">for</span> <span style="color: #000000;">(</span> <span style="color: #800080;">$i</span> <span style="color: #000000;">=</span> <span style="color: #000000;">0</span> <span style="color: #000000;">; </span> <span style="color: #800080;">$i</span> <span style="color: #000000;"> <span style="color: #000000;">1000</span> <span style="color: #000000;">;</span> <span style="color: #000000;">++</span> <span style="color: #800080;">$i</span> <span style="color: #000000;">) </span> <span style="color: #800080;">$model</span> <span style="color: #000000;">-></span> <span style="color: #000000;">getBaseInfo(</span> <span style="color: #800080;">$uid</span> <span style="color: #000000;">); t</span> <span style="color: #000000;">::</span> <span style="color: #008080;">end</span> <span style="color: #000000;">(); </span> </span></span></p>
于是更让人无语的结果出来了:
<p> <span style="color: #000000;"> Start @</span> <span style="color: #000000;">1287562243.5799</span> <span style="color: #000000;">(</span> <span style="color: #000000;">1009372</span> <span style="color: #000000;">)</span> <span style="color: #000000;">|-------></span> <span style="color: #008080;">End</span> <span style="color: #000000;"> @</span> <span style="color: #000000;">1287562243.5799</span> <span style="color: #000000;">(</span> <span style="color: #000000;">1009372</span> <span style="color: #000000;">) </span> <span style="color: #000000;">:|=======</span> <span style="color: #000000;"> 共耗时:</span> <span style="color: #000000;">3.0040740966797E-5</span> <span style="color: #000000;">,共用内存:</span> <span style="color: #000000;">0</span> <span style="color: #000000;"> Start @</span> <span style="color: #000000;">1287562243.58</span> <span style="color: #000000;">(</span> <span style="color: #000000;">1009372</span> <span style="color: #000000;">)</span> <span style="color: #000000;">|-------></span> <span style="color: #008080;">End</span> <span style="color: #000000;"> @</span> <span style="color: #000000;">1287562244.1532</span> <span style="color: #000000;">(</span> <span style="color: #000000;">1587544</span> <span style="color: #000000;">) </span> <span style="color: #000000;">:|=======</span> <span style="color: #000000;"> 共耗时:</span> <span style="color: #000000;">0.57321000099182</span> <span style="color: #000000;">,共用内存:</span> <span style="color: #000000;">578172</span> <span style="color: #000000;"> Start @</span> <span style="color: #000000;">1287562244.1532</span> <span style="color: #000000;">(</span> <span style="color: #000000;">1587544</span> <span style="color: #000000;">)</span> <span style="color: #000000;">|-------></span> <span style="color: #008080;">End</span> <span style="color: #000000;"> @</span> <span style="color: #000000;">1287562244.6921</span> <span style="color: #000000;">(</span> <span style="color: #000000;">1587744</span> <span style="color: #000000;">) </span> <span style="color: #000000;">:|=======</span> <span style="color: #000000;"> 共耗时:</span> <span style="color: #000000;">0.53887605667114</span> <span style="color: #000000;">,共用内存:</span> <span style="color: #000000;">200</span> <span style="color: #000000;"> </span> </p>
除了两种方式时间上开始接近外(并且还是正常调用比较利索),内存上仍然有天壤之别。失望之余,查了下网上,发现也有人做了类似的测试。我就直接把结果拷上来吧:
(可能光看结果,会感觉有点难于理解,可以在这里找到详细说明:http://vega.rd.no/articles/php-static-method-performance)
测试结果 (ORDER BY time DESC):
<p> <span style="color: #000000;"> </span> <span style="color: #000000;">============</span> <span style="color: #000000;">Which method</span> <span style="color: #000000;">========================</span> <span style="color: #008080;">Time</span> <span style="color: #000000;">======</span> <span style="color: #000000;"> Inline calculation </span> <span style="color: #000000;">0.0805</span> <span style="color: #000000;"> s Normal </span> <span style="color: #0000ff;">function</span> <span style="color: #000000;"> call </span> <span style="color: #000000;">0.3438</span> <span style="color: #000000;"> s Normal method called through </span> <span style="color: #0000ff;">object</span> <span style="color: #000000;"> </span> <span style="color: #000000;">0.4118</span> <span style="color: #000000;"> s </span> <span style="color: #0000ff;">Static</span> <span style="color: #000000;"> method called statically </span> <span style="color: #000000;">0.4280</span> <span style="color: #000000;"> s Unspecified method called through </span> <span style="color: #0000ff;">object</span> <span style="color: #000000;">() </span> <span style="color: #000000;">0.4294</span> <span style="color: #000000;"> s Unspecified method called statically() </span> <span style="color: #000000;">0.6960</span> <span style="color: #000000;"> s </span> </p>
如此看来,静态调用非静态方法在性能和内存上都不占优势;另外,此种调用方法容易产生维护混乱。那么,来个短而有力的总结:静态调用非静态方法不可取。[code=PHP][/code][code=PHP][/code]

데이터베이스 스토리지 세션 사용의 주요 장점에는 지속성, 확장 성 및 보안이 포함됩니다. 1. 지속성 : 서버가 다시 시작 되더라도 세션 데이터는 변경되지 않아도됩니다. 2. 확장 성 : 분산 시스템에 적용하여 세션 데이터가 여러 서버간에 동기화되도록합니다. 3. 보안 : 데이터베이스는 민감한 정보를 보호하기 위해 암호화 된 스토리지를 제공합니다.

SessionHandlerInterface 인터페이스를 구현하여 PHP에서 사용자 정의 세션 처리 구현을 수행 할 수 있습니다. 특정 단계에는 다음이 포함됩니다. 1) CustomsessionHandler와 같은 SessionHandlerInterface를 구현하는 클래스 만들기; 2) 인터페이스의 방법 (예 : Open, Close, Read, Write, Despare, GC)의 수명주기 및 세션 데이터의 저장 방법을 정의하기 위해 방법을 다시 작성합니다. 3) PHP 스크립트에 사용자 정의 세션 프로세서를 등록하고 세션을 시작하십시오. 이를 통해 MySQL 및 Redis와 같은 미디어에 데이터를 저장하여 성능, 보안 및 확장 성을 향상시킬 수 있습니다.

SessionId는 웹 애플리케이션에 사용되는 메커니즘으로 사용자 세션 상태를 추적합니다. 1. 사용자와 서버 간의 여러 상호 작용 중에 사용자의 신원 정보를 유지하는 데 사용되는 무작위로 생성 된 문자열입니다. 2. 서버는 쿠키 또는 URL 매개 변수를 통해 클라이언트로 생성하여 보낸다. 3. 생성은 일반적으로 임의의 알고리즘을 사용하여 독창성과 예측 불가능 성을 보장합니다. 4. 실제 개발에서 Redis와 같은 메모리 내 데이터베이스를 사용하여 세션 데이터를 저장하여 성능 및 보안을 향상시킬 수 있습니다.

JWT 또는 쿠키를 사용하여 API와 같은 무국적 환경에서 세션을 관리 할 수 있습니다. 1. JWT는 무국적자 및 확장 성에 적합하지만 빅 데이터와 관련하여 크기가 크다. 2. 쿠키는보다 전통적이고 구현하기 쉽지만 보안을 보장하기 위해주의해서 구성해야합니다.

세션 관련 XSS 공격으로부터 응용 프로그램을 보호하려면 다음 조치가 필요합니다. 1. 세션 쿠키를 보호하기 위해 Httponly 및 Secure 플래그를 설정하십시오. 2. 모든 사용자 입력에 대한 내보내기 코드. 3. 스크립트 소스를 제한하기 위해 컨텐츠 보안 정책 (CSP)을 구현하십시오. 이러한 정책을 통해 세션 관련 XSS 공격을 효과적으로 보호 할 수 있으며 사용자 데이터가 보장 될 수 있습니다.

PHP 세션 성능을 최적화하는 방법 : 1. 지연 세션 시작, 2. 데이터베이스를 사용하여 세션을 저장, 3. 세션 데이터 압축, 4. 세션 수명주기 관리 및 5. 세션 공유 구현. 이러한 전략은 높은 동시성 환경에서 응용의 효율성을 크게 향상시킬 수 있습니다.

THESESSION.GC_MAXLIFETIMESETTINGINSTTINGTINGSTINGTERMINESTERMINESTERSTINGSESSIONDATA, SETINSECONDS.1) IT'SCONFIGUDEDINPHP.INIORVIAINI_SET ()

PHP에서는 Session_Name () 함수를 사용하여 세션 이름을 구성 할 수 있습니다. 특정 단계는 다음과 같습니다. 1. Session_Name () 함수를 사용하여 Session_Name ( "my_session")과 같은 세션 이름을 설정하십시오. 2. 세션 이름을 설정 한 후 세션을 시작하여 세션을 시작하십시오. 세션 이름을 구성하면 여러 응용 프로그램 간의 세션 데이터 충돌을 피하고 보안을 향상시킬 수 있지만 세션 이름의 독창성, 보안, 길이 및 설정 타이밍에주의를 기울일 수 있습니다.


핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

드림위버 CS6
시각적 웹 개발 도구

WebStorm Mac 버전
유용한 JavaScript 개발 도구

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

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

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.
