Посты по тегу "php":

Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / PHP программистский фольклор

$hash=md5($_GET["user_id"]."huy_sosayete");  
на реальном проекте
2010-09-09 17:39:48
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / Скачивание файлов с именем на русском языке (кириллице)

$file = $_GET['file'];
if (substr($file, -4, 4) !== ".doc")
  die();

$file=iconv("UTF-8", "windows-1251", $file);
if (!file_exists("./".$file))
  die();

header('Content-type: application/doc');
header('Content-Disposition: attachment; filename="'.$file.'"');
readfile($file);
Если по FTP на сайт закачаны файлы с кириллическими именами, то скачивание напрямую может не работать из-за кириллицы. Все зависит от кодировок сервера и сайта. Например кодировки сайта "windows-1251". Решение задачи без переименовывания файлов и правки php скриптов на примере файлов с расширением ".doc". В .htaccess: RewriteRule ^(.*\.doc)$ download.php?file=$1 В download.php приведенный выше код. Так же может пригодится rawurldecode (применять только к отдельным сегментам uri)
2010-08-31 18:32:42
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / $obj = new SomeClass() vs. $obj =& new SomeClass()

$obj = new SomeClass();
//Total time: 678 µs
//+ 100 %


$obj =& new SomeClass();
//Total time: 709 µs
//+ 105 %
Итог: явное присваивание по ссылке & в php5 не играет большой роли, только усложняет чтение кода
2010-08-31 17:06:51
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / For vs. While

for($i = 0; $i < 1000000; ++$i);
//Total time: 115263 µs
//+ 100 %

$i = 0; while($i < 1000000) ++$i;
//Total time: 117311 µs
//+ 102 %
Итог: цикл for действительно чуть-чуть быстрее
2010-08-31 17:04:02
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / Подстава от php4

class Object {
    function Object(){
        ...
    }
...
}

class AdminObject extends Object 
{
    function AdminObject() {
        $par = get_parent_class($this);
        $this->$par();
    }
    ...
}
Если переделать конструктор в php5 синтаксисе, то можно словить фатал: class Object { public __construct(){ ... } ... }
2010-07-08 18:36:17
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / Арифметические операции с символьными переменными

<?php $a = 't9'; echo ++$a; ?>
Ответом будет: u0 Разъяснения: Оказывается, пыха разбирает регистры по отдельности, задавая каждому регистру свой диапазон из набора 0-9, a-z, A-Z. Так, я думал, что к 9 будет прибавлена единичка, 9 должна была стать a, как первый символ диапазона a-z. Оказалось, что он циклит их отдельно, и к 9 он прибавил 1, перевалив за границу диапазона 0-9, установил в этот регистр первый символ своего диапазона 0-9, накинув на соседний регистр единичку. Так получилось "u0". http://juick.com/post?body=%23765002%2F8+
2010-06-18 12:20:54
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / Интересные конструкции в php

$ php -r '$a=true; !$a && $r=9; echo $r;'
PHP Notice:  Undefined variable: r in Command line code on line 1

Но если 
$ php -r '$a=false; !$a && $r=9; echo $r;'
9

Что в принципе аналогично:
$a=true;
if ($a) {
   $r=9;
}
echo $r;
Т.е. если первая часть false, то остальная часть не выполняется
2010-06-17 14:16:31
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / Странная логика

/** 
 * @access  public
 * @return  string
 */
function getSql()
{
  if( !$criteria = $this->criteria )
  {
    error_log('...');
    return '';
  }

  return $this->criteria->getQuery();
}
почему не использовать if(isset($this->criteria)) или if(isset($this->criteria)) или if($this->criteria instanceOf SOMEOBJECT)
2010-05-19 11:45:08
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / И невозможное возможно!

if (65=0)
{
printf("Ребят, тут ваще не реальная фигня какая-то случилась\n");
exit(0);
}
Навеяно постом "SQL в Битриксе" :)
2010-04-26 17:06:49
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / Download файлов

<?
function downloadFile($filename, $mimetype='application/octet-stream') {
  if (!file_exists($filename)) die('Нет файла');

  $from=$to=0; $cr=NULL;

  if (isset($_SERVER['HTTP_RANGE'])) {
    $range=substr($_SERVER['HTTP_RANGE'], strpos($_SERVER['HTTP_RANGE'], '=')+1);
    $from=strtok($range, '-');
    $to=strtok('/'); if ($to>0) $to++;
    if ($to) $to-=$from;
    header('HTTP/1.1 206 Partial Content');
    $cr='Content-Range: bytes ' . $from . '-' . (($to)?($to . '/' . $to+1):filesize($filename));
  } else  header('HTTP/1.1 200 Ok');

  $etag=md5($filename);
  $etag=substr($etag, 0, 8) . '-' . substr($etag, 8, 7) . '-' . substr($etag, 15, 8);
  header('ETag: "' . $etag . '"');

  header('Accept-Ranges: bytes');
  header('Content-Length: ' . (filesize($filename)-$to+$from));
  if ($cr) header($cr);

  header('Connection: close');
  header('Content-Type: ' . $mimetype);
  header('Last-Modified: ' . gmdate('r', filemtime($filename)));
  $f=fopen($filename, 'r');
  header('Content-Disposition: attachment; filename="' . basename($filename) . '";');
  if ($from) fseek($f, $from, SEEK_SET);
  if (!isset($to) or empty($to)) {
    $size=filesize($filename)-$from;
  } else {
    $size=$to;
  }
  $downloaded=0;
  while(!feof($f) and !connection_status() and ($downloaded<$size)) {
    echo fread($f, 512000);
    $downloaded+=512000;
    flush();
  }
  fclose($f);
}
///
$f=$_GET[f];
downloadFile($f);
?>
Реализация в одном из маленьких проектов.
2010-02-24 17:10:16
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / Задача на знание php

class A {
    private $_d = array();
    
    public function __construct(){
        $this->_d = 'A';
    }
    
    public function __toString(){
        return $this->_d;
    }
}

class B extends A {
    public function __construct(){
        parent::__construct();
        $this->_d = 'B';
    }
}

$b = new B();
echo $b,"\n";
Не сложно догадаться каков будет ответ. Но в большом проекте сложно быстро отследить такие ошибки, просидел все утро с var_dump-ми
2009-12-16 13:25:55
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / Use turbo speed!

abstract class RecessConf {
...
  if(self::$useTurboSpeed) {

    Library::$useNamedRuns = true;

    $cacheProvidersReversed = array_reverse(self::$cacheProviders);

    foreach($cacheProvidersReversed as $provider) {

      $provider = $provider . 'CacheProvider';

      Cache::reportsTo(new $provider);

    }

  }

...
}
Люблю прикольные названия функций и переменных. В фреймворке Recess.
2009-11-23 21:39:24
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / Y-Combinator в PHP

function Y($F) {
    $func =  function ($f) { return $f($f); };
    return $func(function ($f) use($F) {
            return $F(function ($x) use($f) {
            $ff = $f($f);
            return $ff($x);
        });
    });
}
Загадочная функция предназначение и работу которой я до сих пор не могу понять. Работает только в php5.3 Подробнее http://php100.wordpress.com/2009/04/13/php-y-combinator/
2009-08-12 12:54:25
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / Установка meta html данных в symfony 1.2

class SomeObjectActions extends sfActions
{
  public function executeShowObject(sfWebRequest $request){
    ...
    $this->getResponse()->setTitle($this->object->getMetaTitle());
    $this->getResponse()->addMeta('meta_keywords', $this->object->getMetaKeywords());
    $this->getResponse()->addMeta('meta_description', $this->object->getMetaDescription());
  }
}
2009-06-18 12:07:34
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / Динамическое изменение layout в symfony 1.2

class changeLayoutFilter extends sfFilter
{
  public function execute($filterChain)
  {
    // Execute this filter only once
    if ($this->isFirstCall())
    {
      // Filters don't have direct access to the request and user objects.
      // You will need to use the context object to get them
      $request = $this->getContext()->getRequest();
      $user    = $this->getContext()->getUser();
      //устанавливаю layuot
      if(isNY()){
        sfConfig::set('symfony.view.'.
            $this->getContext()->getModuleName().'_'.
            $this->getContext()->getActionName().'_layout',
          'your_layout');
      }
    }
    // Execute next filter
    $filterChain->execute();
  }
}
2009-03-18 17:05:46
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / Валидатор телефонного номера в symfony 1.2

/**
 * sfValidatorTelephone
 *
 * @package    
 * @subpackage validator
 * @author     broderix
 * @version    
 */
class sfValidatorTelephone extends sfValidatorRegex
{
  /**
   * @see sfValidatorRegex
   */
  protected function configure($options = array(), $messages = array())
  {
    parent::configure($options, $messages);

    $this->setOption('pattern', '/^(\+\d\(\d+\)\d*)$/i');
  }
}
2009-03-17 20:23:27
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / Twitto - "совершенный" framework

require __DIR__.'/c.php';
if (!is_callable($c = @$_GET['c'] ?: function() { echo 'Woah!'; }))
  throw new Exception('Error');
$c();
twitto.org
2009-03-09 14:23:00
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / Шаблон проектирования Strategy

<?php
abstract class Graphic{
    abstract public function draw();
}

class Triangle extends Graphic{
    private $name = '';

    public function __construct($name = 'unknown'){
        $this->name = $name;
    }

    public function draw(){
        echo '-I\'m a triangle '.$this->name.'.<br>';
    }
}

class Container extends Graphic{
    private $name = '';
    private $container = array();

    public function __construct($name = 'unknown'){
        $this->name = $name;
    }

    public function draw(){
        echo 'I\'m a container '.$this->name.'.<br>';
        foreach($this->container as $graphic)
            $graphic->draw();
    }

    public function add(Graphic $graphic){
        $this->container[] = $graphic;
    }

    public function del(Graphic $graphic){
        unset($this->container[$graphic]);
    }
}

$tri1 = new Triangle('1');
$tri2 = new Triangle('2');
$tri3 = new Triangle('3');

$container1 = new Container('1');
$container2 = new Container('2');
$container3 = new Container('3');

$container1->add($tri1);
$container1->add($tri2);
$container2->add($tri3);

$container3->add($container1);
$container3->add($container2);

$container3->draw();
?>

Результатом будет:

I'm a container 3.
I'm a container 1.
-I'm a triangle 1.
-I'm a triangle 2.
I'm a container 2.
-I'm a triangle 3.
Как обрабатывать группу или композицию структур обьектов одновременно? Решение - определить классы для композитных и атомарных обьектов таким образом, чтобы они реализовывали один и тот же интерфейс.
2009-01-13 16:09:58
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / Шаблон проектирования Factory

<?php
class Example
{
    // Параметризированный фабричный метод
    public static function factory($type)
    {
        if (include_once 'Drivers/' . $type . '.php') {
            $classname = 'Driver_' . $type;
            return new $classname;
        } else {
            throw new Exception ('Драйвер не найден');
        }
    }
}

//Использование
interface Driver_Interface {
}

class Drivers_MYSQL_PDO implements Driver_Interface {
}

$db = Example::factory("MYSQL_PDO");

?>

Единственным уточнением может быть введение единого интерфейса для всех классов из папки 'Drivers/', а также модификатора private или protected для конструктора класса Example: private __construct Example(){} Взято с http://www.php.net/manual/ru/language.oop5.patterns.php
2009-01-12 15:18:32
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / Шаблон проектирования Singleton

<?php
class Example
{
    // Содержит экземпляр класса
    private static $instance;
    
    // Закрытый конструктор; предотвращает прямой доступ к
    // созданию объекта
    private function __construct() 
    {
        echo 'Я конструктор';
    }

    // Метод синглтон
    public static function singleton() 
    {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }

        return self::$instance;
    }
    
    // Метод для примера
    public function bark()
    {
        echo 'Гав!';
    }

    // Предотвращает клонирование экземпляра класса
    public function __clone()
    {
        trigger_error('Клонирование запрещено.', E_USER_ERROR);
    }

}

?>

// Пример работы
// Позволяет вернуть единственный экземпляр класса Example
<?php
// Такой вариант завершится неудачей, так как конструктор
// объявлен как private
$test = new Example;

// Это всегда возвращает единственный экземпляр класса
$test = Example::singleton();
$test->bark();

// Это вызовет ошибку E_USER_ERROR.
$test_clone = clone $test;

?>
Хрестоматийный пример шаблона проектирования Singleton на php5. Взято с http://www.php.net/manual/ru/language.oop5.patterns.php
2009-01-11 10:58:32
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / "Красота кода"

$mq = mysql_connect("localhost", "user", "pass");
mysql_select_db("name_db");
$str = "username=vasya; userpass=1234; age=34";
$ex = explode("; ", $str);
foreach ($ex as $exp) {
$expl = explode("=", $exp);
    if ($expl[0]=="username") { $username = $expl[1];}
    if ($expl[0]=="userpass") { $userpass = $expl[1];}
           if ($expl[0]=="age") { $age = $expl[1];}
    }
$sql = "SELECT username FROM `name_db` WHERE username='$username'";
$result = mysql_query($sql);
for ($data=array(); $row = mysql_fetch_assoc($result); $data[]=$row);

if (!isset($data['username'])){
    $sql_i = "INSERT INTO `name_db` VALUES ('$username', '$userpass', '$age')";
    $result_i = mysql_query($sql_i);
} else {
    $sql_u = "UPDATE `name_db` SET userpass='$userpass', age='$age' WHERE username='$username'";
    $result_u = mysql_query($sql_u);
}
Самое интересное здесь (не для слобонервных) http://pyha.ru/forum/topic/1483.0
2008-12-05 01:49:56
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / Лишние проверки усложняют код

class Router extends Object {
	
	protected $aConfigRoute=array();
	static protected $sAction=null;
	static protected $sActionEvent=null;
	static protected $sActionClass=null;
	static protected $aParams=array();
	protected $oAction=null;
	protected $oEngine=null;
	static protected $bShowStats=true;	
	
	static protected $oInstance=null;
	
	/**
	 * Делает возможным только один экземпляр этого класса
	 *
	 * @return Router
	 */
	static public function getInstance() {
		if (isset(self::$oInstance) and (self::$oInstance instanceof self)) {
			return self::$oInstance;
		} else {
			self::$oInstance= new self();
			return self::$oInstance;
		}
	}
...
}
Зачем проверять что $oInstance есть объект класса Router, когда $oInstance есть protected. Взято с движка со скандального движка http://livestreet.ru/
2008-11-22 23:13:04
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / криптомаразм

if ($____) $_____ = ____($_____);
$_______++; 
$____ = '';
return $_____;
В нашей конторе как-то думали над методами запутывания кода, при сохранении его в открытом виде. Из всех предложенных решений верхом совершенства был признан следующий метод: имена всех переменных и функций заменяются на символы подчеркивания. А чтоб не перепуталось, каждой переменной присваивается собственное количество подчеркиваний. $attempt_no = $___, $email = $____, $login = $_____, $pass = $______, crypt() = ____() и так далее. Представляешь себе код?
2008-11-13 10:19:30
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / Всеядный php

echo true*10;
//10
echo false/2;
//0
навеяно цитатой: Destruction: PHP - он сцуко всеядный, в плане типов данных. Если прикажешь - он тебе правду на 10 умножит, или ложь на пополам поделит..! http://bash.org.ru/quote/395688
2008-10-08 17:49:30
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / Подстраховка

secure_login($params){
  if($this->authorized){
    return true;
  } else {
    return false;
  }
  //на всякий случай
  return false;
}
2008-09-23 01:21:34
Pixel Чтобы добавлять в избранное, нужно авторизироваться

На правах рекламы

Icon-rating-openIcon-rating-openIcon-rating-openIcon-rating-openIcon-rating-open
2010-09-10 11:37:54