Home > Backend Development > PHP Tutorial > php learning 01

php learning 01

WBOY
Release: 2016-07-29 09:14:28
Original
1189 people have browsed it

<code><?php
/*
 * 回顾
 * php 魔术方法
 * __<span>set</span>() 当在类外使用类的private 属性时,或不存在的属性时会报错,如果设置了__<span>set</span>()方法,那么就会调用这个方法
 *    __<span>set</span>(成员属性名名称,要设置的成员属性的值)
 * __get() 当在类外获取类的private 属性时,属性时,或不存在的属性时会报错, 如果设置了__get()方法,那么就会调用这个方法
 *    __get(成员属性的名称)
 * __call() 当调用类的不存在的方法时,会报错,若定义了改方法,那么就调用此方法
 *    __call(被调用的方法名,该方法的参数)
 * __callStatic(被调用的方法名,该方法的参数)
 * __clone() 当<strong>对象</strong>克隆时调用该方法
 *    __clone(),默认参数为<span>$this</span>,<span>$that</span>, <span>$this</span> 为要克隆出的<strong>对象</strong>,<span>$that</span>为原<strong>对象</strong>
 * __construct 构造函数
 * __destruct 析构函数
 * __sleep(); 当<strong>对象</strong>序列化之前被调用
 * __wakeup()当反序列化之前调用
 * __autoload(被包含的类名) 当调用一个类名的方法时,如果没有将该类包含进来, 则会报错,当定义了此函数时,就会调用此函数动态加载类文件
   __toString()  当直接输出类的<strong>对象</strong>时会报错,如果定义的该方法,则调用此方法
 *  */

class A {
    private <span>$name</span>;
    private <span>$age</span>;
    public function __construct(<span>$name</span>,<span>$age</span>){
        <span>$this</span>->name = <span>$name</span>;
        <span>$this</span>->age = <span>$age</span>;
    }
    public function __<span>set</span>(<span>$name</span>,<span>$value</span>){
        <span>$this</span>-><span>$name</span> = <span>$value</span>;
    }
    public function __get(<span>$name</span>){
        <span>if</span>(<span>$name</span>==<span>'fuck'</span>)
            <span>return</span><span>"fuck!"</span>;
        <span>if</span>(isset(<span>$this</span>-><span>$name</span>)){
            <span>return</span><span>$this</span>->name;
        }<span>else</span>{
            <span>return</span> NULL;
        }
    }
    public function __call(<span>$name</span>,<span>$args</span>){
        <span>echo</span><span>$name</span> ,<span>"Mothod不存在"</span>;
        var_dump(<span>$args</span>);
    }
    public static function __callStatic(<span>$name</span>,<span>$value</span>){
        <span>echo</span><span>"<strong>静态方法</strong><span>$name</span>不存在"</span>;
    }
    public function <span><span>__clone</span></span>() {
         <span>$this</span>->name = <span>"我是被克隆的"</span>;
    }
    public function <span><span>__sleep</span></span>() {
       // <span>echo</span><span>"正在被序列化"</span>;
        <span>return</span> array(name);
    }
    //重新生成<strong>对象</strong>时,调用
    public function <span><span>__wakeup</span></span>() {
        <span>$this</span>->name = <span>"张三"</span>;
        <span>$this</span>->age = <span>234</span>;
    }
    public function <span><span>__toString</span></span>() {
        <span>return</span><span>"A"</span>;
    }

}
//<span>$a</span> = new A(<span>"张三"</span>,<span>22</span>);
//<span>echo</span><span>$a</span>->name;
//<span>$a</span>->name = <span>"张三"</span>;
//<span>echo</span><span>$a</span>->name;
//<span>$a</span>->get(<span>"xue"</span>,<span>3</span>,<span>"sf"</span>) ;
//<span>$a1</span> = clone <span>$a</span>;
//<span>echo</span><span>$a</span>->name,<span>"<br/>"</span>,<span>$a1</span>->name;
//<span>$p_str</span> = serialize(<span>$a</span>);
//<span>echo</span><span>$p_str</span>;
//<span>$a2</span> = unserialize(<span>$p_str</span>);
//var_dump(<span>$a2</span>);
//function __autoload(<span>$classname</span>){
//       <strong>include</strong> <span>$classname</span>.<span>".php"</span>;
//}
//<span>echo</span><span>$a2</span>->fuck;
//A::ha();
/*
 * <span>1</span>. <span>echo</span> 和print 的区别
 *  <span>echo</span> 是语句,不是函数, 不用括号,可以输出多个值,没有返回值,不能输出数组和<strong>对象</strong> 只能输出简单的类型,如 int,string 
 *  print 是语句,不是函数,不用括号,只能输出一个值,有返回值<span>1</span>,不能输出数组和<strong>对象</strong>,只能输出简单的类型,如int,string
 * <span>2</span>.print_r() 和 var_dump()
 *  print_r() 是函数,可以输出复合类型和简单类型,如int float ,string ,array object,当输出<strong>对象</strong>时以机构表示如 Object{},当输出
 *   数组时表示为Array()
 *  var_dump() 是函数,输出变量的内容,类型,长度,可以输出简单类型,复合类型,常用来调试
 * <span>3</span>.printf 是函数,类似C语言,格式化字符串输出
 * <span>4</span>.sprintf 函数,类似C语言,格式化字符串后返回一个格式化后的字符串不输出
 * 
 */
//print_r(<span>3.55</span>);
//<span>$arr</span> = array(<span>"xue"</span>,<span>3</span>);
// print_r(<span>$arr</span>);
// var_dump(<span>$arr</span>);
//<span>$nb</span> = sprintf(<span>"%s 是个%d吊"</span>,<span>"haha"</span>,<span>3</span>);
//<span>echo</span><span>$nb</span>;
/*
 * 获取文件内容方式
 * <span>1</span>.file_get_contents();
 * 
 */
//<span>$txt</span> = file_get_contents(<span>'data.txt'</span>);
//<span>echo</span><span>$txt</span>;
//<span>$file</span> = fopen(<span>"data.txt"</span>,<span>"r"</span>);
//<span>while</span>(!feof(<span>$file</span>)){
//    <span>$line</span> = fgets(<span>$file</span>);
//   // <span>echo</span><span>$line</span>;
//    
//}
//<span>while</span>(!feof(<span>$file</span>)){
//    <span>$char</span> = fgetc(<span>$file</span>);
//     <span>echo</span><span>$char</span>;
//}
/*
 * strlen() he mb_strlen的区别
 * 两者都是求字符串长度的函数
 * 在strlen只是获得字符串所占的字节数,无法正确处理中文字符
 * 当为GB2313编码时,一个汉字占<span>2</span>位,当为UTF-<span>8</span>编码时,一个汉字占<span>3</span>位
 * mb_strlen()能够正确处理汉字,第二个参数为编码的类型,默认为UTF-<span>8</span>,默认为PHP内部的编码,可以用mb_internal_encoding()来查看
 * mb_strlen()并不是php核心函数, 需要加载扩展库来使用,在php.in中 extension = <span>"php_mb_string.dll"</span>
 */
//<span>$str</span> = <span>"黛玉123f"</span>;
//<span>echo</span> strlen(<span>$str</span>); // 输出<span>10</span>
//<span>echo</span> mb_strlen(<span>$str</span>,<span>'UTF-8'</span>); //输出<span>6</span>
//<span>echo</span> mb_internal_encoding();//输出 ISO-<span>8859</span>-<span>1</span>
//
/*
 * php数组函数
 * 数组的键名和值
 * <span>1</span>.is_array()判断是否是数组,是返回TRUE,不是返回<span>false</span>,类似 is_int(); is_float();
 * <span>2</span>.array explode ( string <span>$delimiter</span> , string <span>$string</span> [, int <span>$limit</span> ] )此函数将字符串分割为数组
 * <span>3</span>.string implode ( string <span>$glue</span> , array <span>$pieces</span> )将数组分割为字符串
 * <span>4</span>.array_values()返回数组所有的值,请给其建立数字<strong>索引</strong>
 * <span>5</span>.array array_keys ( array <span>$input</span> [, mixed <span>$search_value</span> = NULL [, bool <span>$strict</span> = <span>false</span> ]] )
 * <span>6</span>.array_key_exists() 检索指定的键名或<strong>索引</strong>是否在数组中,存在返回<span>true</span>,否则返回<span>false</span>
 * <span>7</span>.array_flip()交换数组的键名和值,若存在相同值,则以最后一个键值为准
 * <span>8</span>.array_search() 在数组中搜索给定的值,若存在返回对应的键名,否则返回FALSE
 * <span>9</span>.检索数组中是否存在某个值,存在返回<span>true</span>,不存在返回FALSE
 * <span>10</span>.isset(<span>$arr</span>[<span>'apple'</span>] 检测指定的键名知否存在给定的数组中,存在返回<span>true</span>,否则返回<span>false</span>
 * 数组的内部指针
 * current(<span>$arr</span>);  返回数组中的当前单元
   pos(<span>$arr</span>);  返回数组中的当前单元
   key(<span>$arr</span>);  返回数组中当前单元的键名
   prev(<span>$arr</span>);  将数组中的内部指针倒回一位
   next(<span>$arr</span>);  将数组中的内部指针向前移动一位
   end(<span>$arr</span>);  将数组中的内部指针指向最后一个单元
   reset(<span>$arr</span>;  将数组中的内部指针指向第一个单元
 * each(<span>$arr</span>);  返回数组当前指针单元的键名和值,以新数组的形式,且当前数组的指针向前移动一步,若到达数组最后一个单元, 则停留为最后一个单元
 *  键值对被返回为四个单元的数组,键名为>,key 和 value。单元 <span>0</span> 和 key 包含有数组单元的键名,<span>1</span> 和 value 包含有数据。 
 * list(<span>$key</span>,<span>$value</span>);  不是真正的函数,是一种语言结构,获得数组当前元素的键名和值,并赋值给变量,list只能用于没有键名和<strong>索引</strong>的数组
 * 
 * 数组和变量之间的转换
 * extract() 从数组中将变量导入到当前的符号表
 * 检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突。 
 * compact() 将变量变为数组
 * 数组的分段和填充
 * array_slice 在数组中取出一段
 *   array_slice(<span>$array</span>,int offset,[int length,<span>false</span>|<span>true</span>]);
 * 若偏移量为负数,则从数组末端开始数
 * 若长度为负数,则序列将终止在距离数组末端这么远的地方
 * array array_splice ( array &<span>$input</span> , int <span>$offset</span> [, int <span>$length</span> = <span>0</span> [, mixed <span>$replacement</span> ]] )
 *   删除数组的某段,根据offset和length,可以用replacement替换被被删除的单元,替换个数和被替换的单元的个数一致,如果为数组,则键名
 *  不保留,只替换值,也可以为字符串,如果没有删除的单元,那么替换的变量将会被插入到offset的位置
 * 
 *  分割多个数组
 *  array_chunk(array,size,[<span>true</span>|<span>false</span>])
 *  将一个数组分割成多个数组,每个数组的元素量为size,size小于<span>1</span>将报错,可能最后一个数组的元素小于size,默认为<span>false</span>,将丢掉原数组的<strong>索引</strong>或键名
 *    重新建立从<span>0</span>开始的数字<strong>索引</strong>,为<span>true</span>时,保留原来的键名或<strong>索引</strong>
 *  
 *  数组的填充
 *  array_pad(array,length,value);
 *  将数组用value填充到length长度,
 *  若length小于等于数组的长度,则不填充
 *  如果length为负数, 则向左填充
 *  
 *  数组与栈
 *  array_push(array,value,,,);
 *  将一个或多个值压入数组栈,返回此数组的元素个数
 *  array_pop(array);
 *  返回一个数组的栈顶元素,如果数组为空或者不是数组,则返回NULL
 * 
 *  数组与列队
 *  array_shift(array);
 *  将返回数组的第一个元素,数组的元素个数减一,后面的元素向前移动,数字键名从<span>0</span>开始重新技术,关联键名不变
 *  若数组为空,或不为数组,则返回NULL
 *  array_unshift(array,value,,,);
 *  将值插入数组的开头,所有的数字<strong>索引</strong>将重新从<span>0</span>开始技术,关联键名不变
 * 
 *  数组排序
 *  键值排序
 *  sort(array,[]); 将数组的值从小到大排序,操作成功返回<span>true</span>,否则返回<span>false</span>
 *  忽略键名的数组排序
 *  rsort(array[],,),将数组的值从大到小排序,操作成功返回<span>true</span>,否则返回<span>false</span>
 *  忽略键名的数组排序
 *  usort(array,funcname);调用用户定义的函数对数组排序
 *  忽略键名的数值排序
 * 
 *  asort() 保留键名的数值排序
 *  arsort() 保留键名的数值排序
 *  uasort()
 *  =========
 *  键名排序
 *  ksort() 用键名排序,主要用于关联数组
 *  krsort() 按照键名逆序排序
 *  uksort() 自定义函数排序
 *  =========
 *  自然排序法排序
 *  natsort();自然排序
 *  natcasesort()自然排序,忽略大小写
 *  
 *  数组的计算
 *  array_sum()计算数组元素的和
 *  数组的合并
 *  array_merge(array1,array2);则键名会以连续方式重新<strong>索引</strong>
 *  array1+array2  对于相同的键名只保留第一个
 *  如果你想完全保留原有数组并只想新的数组附加到后面,用 + 运算符
 *  array_merge_recursive() 递归合并数组
 *  如果输入的数组中有相同的字符串键名,则这些值会被合并到一个数组中去,这将递归下去,因此如果一个值本身是一个数组,本函数将按照相应的条目把它合并为另一个数组。然而,如果数组具有相同的数组键名,后一个值将不会覆盖原来的值,而是附加到后面。 
 *  
 *  数组的差集
 *  array_diff(array1,array2,array3,,,);返回在array1中但不在其他数组中的元素
 *  array_diff_assoc(array1,array2,array3...);返回在array1中但不在其他数组中的元素,键名也做比较,只有键名和键值都相同时才算
 *  
 *  数组的交集
 *  array_intersect(array1,array2,,,);返回数组的交集
 *  array_intersect_assoc(array1,array2,,,);返回数组的交集,键名也做比较
 *  
 *  其他的数组函数
 *  range(start,max,step);创建一个start到max范围的一个数组,step为步长,默认为<span>1</span>
 *  array_unique()除去数组中重复的值
 *  array_reverse();反转数组,若第二个参数为<span>true</span>时则保留键名
 *  array_rand(array,size);随机返回数组中的一个或多个单元的键名,若为多个则返回包含多个键名的数组
 *  shuffle(array); 将数组的元素打乱,返回FALSE或TRUE
 * 
 *  
 * 

 */
//var_dump  (is_array(<span>3</span>));
<span>$arr</span> = explode(<span>","</span>,<span>"I,am,hello,3"</span>);
print_r(<span>$arr</span>);
<span>echo</span> implode(<span>$arr</span>);
//array_values()
<span>$arr</span> = array_values(array(<span>'name'</span>=><span>'daiyutage'</span>,<span>"age"</span>=><span>20</span>));
print_r(<span>$arr</span>);
<span>$arr</span> = array_keys(array(<span>'name'</span>=><span>"daiyutage"</span>,<span>"age"</span>=><span>20</span>));
print_r(<span>$arr</span>);
var_dump(array_key_exists(<span>'name'</span>,array(<span>"name"</span>=><span>"daiyu"</span>)));
var_dump (array_flip((array(<span>"a"</span>=><span>1</span>,<span>"b"</span>=><span>1</span>,<span>"ddd"</span>=><span>33</span>))));
<span>echo</span><span>in</span>_array(<span>"daiyutage"</span>,array(<span>"name"</span>=><span>"daiyutage"</span>));
<span>$arr</span> = array(<span>"name"</span>=><span>1</span>);
<span>echo</span> isset(<span>$arr</span>[<span>'name'</span>]);

<span>$foo</span> = array(<span>"Robert"</span> => <span>"Bob"</span>, <span>"Seppo"</span> => <span>"Sepi"</span>,<span>"name"</span>=><span>3324</span>);
<span>$bar</span> = each(<span>$foo</span>);
print_r(<span>$bar</span>);
<span>$bar</span> = each(<span>$foo</span>);
print_r(<span>$bar</span>);
<span>$info</span> = array(<span>"name"</span>,<span>"haha"</span>);
<span>unset</span>(<span>$a</span>);
list(<span>$a</span>[<span>0</span>],<span>$a</span>[<span>1</span>])  = <span>$info</span>;
//print_r(<span>$a</span>);
//
//<span>$name</span> = <span>"diayutage"</span>;
//extract(array(
//     <span>"name"</span>=><span>"xue"</span>,
//     <span>"age"</span>=><span>22</span>,
//     <span>"school"</span>=><span>"lut"</span>
//),EXTR_PREFIX_SAME,<span>'WX'</span>);
//<span>echo</span><span>$name</span>,<span>" "</span>,<span>"<span>$age</span>"</span>,<span>"  "</span>,<span>"<span>$school</span>"</span>,<span>" "</span>,<span>$Wx_name</span>;

//课本,<span>1</span>,<span>2</span>,<span>3</span>,《书读百遍,其义自现》
//compact
<span>$firstname</span> = <span>"Peter"</span>;
<span>$lastname</span> = <span>"Griffin"</span>;
<span>$age</span> = <span>38</span>;
<span>$color</span>=<span>"red"</span>;

<span>$rs</span> = array(<span>"color"</span>,<span>"fx"</span>);

//<span>$result</span> = compact(<span>"firstname"</span>, <span>"lastname"</span>, <span>"age"</span>,<span>$rs</span>);
//print_r(<span>$result</span>);
<span>$arr</span> = array(<span>"a"</span>,<span>"xx"</span>=><span>"b"</span>,<span>6</span>=><span>"c"</span>,<span>"d"</span>,<span>"e"</span>);
//print_r(array_slice(<span>$arr</span>,<span>2</span>,-<span>1</span>,<span>true</span>));
//   array_splice(<span>$arr</span>,<span>1</span>,-<span>4</span>,<span>"xxxxx"</span>);
// print_r(<span>$arr</span>);
//print_r(array_chunk(<span>$arr</span>,<span>2</span>,<span>false</span>));
//print_r(array_pad(<span>$arr</span>,-<span>10</span>,<span>33</span>));
//print_r(array_push(<span>$arr</span>,<span>"daiyutage"</span>,<span>"fff"</span>));
//<span>echo</span> array_pop(<span>$arrs</span>);
//<span>echo</span> array_shift(<span>$arr</span>);
array_unshift(<span>$arr</span>,array(<span>"hasdf"</span>,<span>"sf"</span>));

<span>$fruits</span> = array(<span>"lemon"</span>, <span>"sdfsf"</span>=><span>"orange"</span>, <span>"banana"</span>, <span>"apple"</span>);
rsort(<span>$fruits</span>);
function cmp(<span>$a</span>,<span>$b</span>){
     <span>return</span><span>$a</span>==<span>$b</span>?<span>0</span>:<span>$a</span><<span>$b</span>?-<span>1</span>:<span>1</span>;
}
//<span>$brr</span> = array(<span>"fsf"</span>,<span>"fs"</span>=><span>3</span>,<span>10</span>=><span>2</span>,<span>4</span>=><span>244</span>,<span>3244</span>);
//ksort(<span>$brr</span>);
//print_r(<span>$brr</span>);
//print_r(array_merge(<span>$fruits</span>,<span>$brr</span>));//则键名会以连续方式重新<strong>索引</strong>
//<span>$a</span> = array(<span>3</span>=><span>"red"</span>,<span>"hello"</span>,<span>"hello"</span>);
//<span>$b</span> = array(<span>"red"</span>,<span>"fe"</span>);
//print_r(array_intersect_assoc(<span>$a</span>,<span>$b</span>));
//var_dump(range(<span>0</span>,<span>12</span>,<span>9</span>));
//print_r(array_reverse(<span>$fruits</span>));
//print_r(array_rand(<span>$fruits</span>));
//(shuffle(<span>$fruits</span>));
// print_r(<span>$fruits</span>);
//
/*
 * 时区设置
 * date_default_timezone_<span>set</span>()设置时区,时区不正确会报错抛出 E_WARNING 而不是 E_STRICT。不区分大小写
 * date_defalut_timezone_get()获取时区
 * 中国时区为Asia/Shanghai 或 PRC 
 * 
 */
//<span>echo</span> date_default_timezone_get();
//error_reporting(E_ALL);
//date_default_timezone_<span>set</span>(<span>"PRC"</span>);
//<span>echo</span> date_default_timezone_get();
//
/* CGI,PHP_mod,FastCGI的区别
 * CGI 通用网关协议
 * 当客户端请求服务器时,服务器fork一个进程,执行php.cgi程序对php页面进行解析,解析完进程销毁,返回服务器,
 * 每次的请求过程,fork->执行->销毁,效率很低,耗费较多的系统资源
 * php_mod
 * php解释器以模块的形式同apache服务器一起启动,使用同一个进程
 * FastCGI
 * CGI的增强版,相当于一个中间层,使用一个进程,客户端->服务器->FastCGI->php解释实例,FastCGI用一个进程常驻内存,并创建多个CGI实例
 * apache与FastCGI的通信为tcp通信,即FastCGI可以为本机,也可以为远程主机
 * apache与CGI的通信为<strong>进程间通信</strong>,必须为同一主机
 * 小总结:
    cgi : 需要开启若干个进程;
    fastcgi : 需要额外开启一个进程;
    php_mod :无需开启额外进程,因为PHP解析器已集成到web服务器中,跟web服务器在同一个进程。
 * 
 *  php_mod配置方式
 *  在apache中,httpd.conf中
 * <span>1</span>    LoadModule php5_module <span>"C:/php5/php5apache2_2.dll"</span>//大约line <span>127</span><span>2</span>   PHPinidir <span>"C:/php5/php.ini"</span><span>3</span>   //修改配置
<span>4</span>   DirectoryIndex index.html index.php//追加index.php
<span>5</span>   AddType application/x-httpd-php .php //line <span>408</span>左右添加
 *  CGI配置方式
 * 
 * 
 */
//error_reporting(E_ALL);
//setcookie(<span>"haha"</span>);
/*
 * cookie 与 session
 * cookie[<span>'login'</span>] = <span>true</span>;
 * A访问
 * session盒子开
 * session[<span>'login'</span>] = <span>true</span>;
 * B访问
 * session盒子开
 * session[<span>'login'</span>] = <span>true</span>;
 * session 在内存中,如果不区分每一个客户端的session,那么session将无法使用
 * 所以需要将每一个请求的session与其客户端关联
 * 方法:
 * 当第一次请求服务器时,服务器生成一个session_id,
 * 通过http头将session_id发送给浏览器,浏览器保存在将此session_id保存在本地的cookie中
 * 当再次请求服务器时,浏览器发送此cookie,服务器收到后用本地cookie中的session_id来访问此客户端的session
 * 
 * 当cookie被禁用时,如何使用session
 * php默认有两种session传递方式
 * <span>1</span>.cookie
 * <span>2</span>.url  如.php?sid=xxx,或者post提交方式,手动通过url添加sid
 *   url  通过设置php.ini参数,自动添加到url
 *   session.use_cookie=<span>1</span>
 *   session.use_>0
 *   session.use.trans_id=<span>1</span>
 *   然后php会自动在url加PHPSESSION=XXXX
 * 
 * <span>3</span>.文件保存sid,第一个页面把sessionid保存在文件中,第二个页面先从这个文件中取sessionid在判断是否登录
 * <span>4</span>.数据库保存sid,和文件原理相同
 * 
 * 当cookie被禁用时,浏览请求时不会再发送cookie到服务器,那么服务器就会收不到cookie=PHPSESSION的,不能使用session
 * 使用url
 * 在前一个页面开启session后,用session_id()获得session_id,然后以get/post方式传递到后一个页面
 * 第二个页面在用此sessio_id来设置 session_id(),然后开启session_start(),就可以使用前面穿过来的session
 * 注意:session_id()必须在session_start()之前调用
 * 
 *
 * 
 */

session_start();
<span>$_SESSION</span>[<span>'login'</span>] = <span>"daiyutage"</span>;
//<span>$sid</span> = session_id();
<span>echo</span><span>"<a href='b1.php'>另一个页面</a>"</span>;</code>
Copy after login
').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadeIn(1700); }); });

The above introduces PHP learning 01, including include, inter-process communication, objects, indexes, and static methods. I hope it will be helpful to friends who are interested in PHP tutorials.

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template