PHP에서 어떤 기능을 원하십니까? [닫은]


88

지금은 연말 연시이고 모두가 희망하는 바이므로, PHP가 어떤 언어 기능을 추가하고 싶었 을까? 언어에 대한 몇 가지 실용적인 제안 / 소원에 관심이 있습니다. 실용적으로 나는 의미한다 :

  1. 실제로 수행 할 수있는 것 ( "PHP가 내 코드의 의미를 추측하여 버그를 해결하기를 바랍니다"또는 "모든 코드가 5ms 미만으로 실행되기를 바랍니다")
  2. PHP를 다른 언어로 변경할 필요가없는 것 ( ":"괄호 대신 $ 표시를 지우고 공백을 사용하길 바란다 "또는"PHP가 정적으로 입력되어 이름에 #이 붙었 으면 좋겠다 ")
  3. 기존의 모든 코드를 깨뜨릴 필요가없는 것 ( "500 개의 함수 이름을 바꾸고 매개 변수 순서를 바꾸자"는 제외)
  4. 뭔가 않습니다 (: 또는 "나는 12345 마지막으로 수정 된 버그 #을 기원합니다" "내가 거기 XYZ 프로토콜에 대한 지원을 확장 좋겠어요"하지 않음) 언어 또는 몇 가지 흥미로운 그것의 측면을 변경
  5. 난폭 한 것 이상 ( ": PHP가 심하게 빨리 지 않기를 바랍니다")

좋은 소원이 있습니까?

모드 편집 : Stanislav Malyshev 는 핵심 PHP 개발자입니다.


9
@ 스탠 : 그런 종류의 주석을 피하고 싶을지라도 어쨌든 얻을 것입니다. 문제 사람들 PHP와 크게 당신이 게시물에 배제하고 사물의 범주에 있습니다. [...]
Fishtoaster

24
[...] 당신은 "얼굴을 쓰지 않고 얼굴을 때리는 경험을 어떻게 개선 할 수 있을까요?" 우리가 얼굴에 맞은 동안 무료 커피를 마시는 것은 좋을 수도 있습니다. 얼굴에 맞으면 서 근본적인 문제를 해결하지 못합니다. 따라서 여기에 유용한 답변이 있기를 희망하지만 비생산적인 답변에 놀라지 마십시오.
Fishtoaster

5
@Fishtoaster : PHP가 당신을 위해 맞닥 뜨리는 것과 관련이 있다면, 반드시 그것을 멀리하십시오. 당신은 그것을 개선하는 데 가장 관심이 없습니다. 사람들이 있지만 그렇게됩니다. 이 주제는 귀하를위한 것이 아니라 귀하를위한 것입니다. 나는이 사이트가 당신을 위해 많은 주제를 가지고 있다고 확신한다. 이것은 단지 그들 중 하나가 아니다.
StasM

5
나는 피상적 인 개선이 그다지 중요하지 않은 상황으로 얼굴을 맞고있다. 대부분의 사람들의 문제가 근본적인 문제 일 때 나는 그 표면적 개선에 대한 제안을 얻으려는 당신의 시도를 두드리지 않을 것입니다-나는 상황에 따라 도움이되지 않는 몇 가지 대답을 얻을 수있는 이유를 지적하고 있습니다.
Fishtoaster

6
@Fishtoaster : 놀랍게도 모든 사람이 PHP를 싫어하는 것은 아닙니다 . 항상 좋아했습니다. 매우 유연하고 신속합니다 (코딩).
Orbling

답변:


119

명명 된 매개 변수는 신경 쓰지 않습니다.

getData(0, 10, filter => NULL, cache => true, removeDups => true);
// instead of:
getData(0, 10, NULL, true, true);

// or how about:
img(src => 'blah.jpg', alt => 'an albino platypus', title => 'Yowza!');

불행히도 PHP 개발자는 이미 그 아이디어를 shot습니다 .


1
2005 년의 목록입니다. 많은 아이디어가 종료되었다가 다시 태어났습니다. 실제로 좋은 구현이 이루어지면 괜찮을 확률이 높습니다.
StasM

21
내가 가장 좋아하는 파이썬 기능입니다. 코드를 매우 자체 문서화합니다.
Keyo

7
@ Josh K : 가능하지만 '배열'통화는 쓸모없는 쓰레기입니다. 그것은 당신이 정말로하려는 일을 모호하게합니다. 또 다른 옵션은 배열에 대한 간단한 구문입니다. make_img ([ 'src'=> 'blah.jpg', ...]);
Erik van Brakel

2
@Erik : 그것은 나쁜 옵션이 아닙니다. 사소한 배열 래퍼로 이미 할 수있을 때 왜이 혼란을 언어에 추가하는지 말하고 있습니다.
Josh K

4
@Erik : JavaScript []연산자 와 같은 배열에 대한보다 편안한 구문 은 높이 평가됩니다.
Josh K

93

더 많은 역 참조 :

echo something_that_returns_array()[4];

다른 사람들은 명명 된 매개 변수와 더 짧은 배열 구문을 언급했습니다. 짧은 객체 구문도 마음에 들지 않습니다.

$a1 = array(1, 2, 3, 4);
$a2 = [1, 2, 3, 4];

$b1 = (object)array('name' => 'foo');
$b2 = {'name' => 'foo'}; // or something?

18
() [] 구문이 이미 트렁크에 있습니다. 불행히도, 배열 단축키는 거부되었지만 부활을 희망합니다.
StasM

2
이 기능을 좋아합니다. 왜 우리는 배열이 아닌 something_that_returns_object ()-> 4를 가질 수 있습니까?
Bala Clark

4
배열 및 객체 표기법과 같은 자바 스크립트는 흔들릴 것입니다. PHP 코드에서 가장 귀찮게하는 프론트 엔드 개발자로서.
Bleep Bloop

1
@DisgruntledGoat 그것은 참조 :function something_that_returns_array() { return array( 'a', 'b', 'c', 'd', 'e' ); }
Annika Backstrom

2
@DisgruntledGoat : ()->구문 의 문제 는 객체가 반환 될 때만 작동하고 문제를 악화 시키려면 객체에 지정된 이름의 속성 / 메소드가 필요하다는 것입니다. , 당신이 부여한 매개 변수를 받아들이고 더 이상 필요하지 않기를기도하는 등 ...
phant0m

72

약 13 년 동안 PHP로 작업하고 약 4 년 동안 JS로 크게 작업 한 후, PHP가 JS에서 빌리는데 도움이되는 몇 가지 사항이 있습니다.

1) 배열과 객체에 대한 속기 표기법. 나는 이것이 Internals에 대해 논의되고 격추되었을 것이라고 생각한다. 생산성 승리.

예를 들면 다음과 같습니다.

$arr     = [1,2,3,4];
$assoc   = [foo=>'bar', baz=>'boo'];
$stdobj  = {foo->'bar', baz->'boo'};

(IMHO)보다 쓰기 쉽고 깔끔합니다.

$arr     = array(1,2,3,4); // not too bad
$assoc   = array("foo"=>'bar', baz=>'boo'); // not too bad either
$stdobj  = new stdClass; // this gets pretty rough
$stdobj->foo = 'bar';
$stdobj->baz = 'boo';

잠재적 인 혼란에 대한 우려가 제기되었다고 들었습니다. 그러나 이것이 실제로이 문서 표기법보다 더 혼란 스럽습니까? 적어도 PHP에서 stdClass 객체를 만드는 것은 연습을 방해하기에 충분합니다.

2) 이전에 정의 된 함수와 메소드를 재정의 할 수 있으면 정말 유용 할 것입니다. 클래스를 확장하고 새 클래스를 인스턴스화하는 것은 지나치게 복잡하거나 실용적이지 않은 상황을 특히 단순화합니다. 그러나 핵심 / 사용자 공간이 아닌 함수 및 방법의 재정의를 피해야한다고 생각합니다.


이 두 가지 외에도 PHP 투명하게 unicode를 지원 해야 한다고 생각 합니다 . 이것은 개발자들에게 점점 더 많은 문제가되고 있으며 현재 PHP로 제공되는 솔루션은 혼란스럽고 자주 수행되지 않습니다. 모든 표준 문자열 기능을 유니 코드 친화적으로 만드는 것은 PHP 프로그래머에게는 큰 승리입니다.

질문 주셔서 감사합니다!


(2) runkit을보십시오. (3) 유니 코드는 어렵다. 특히 대부분의 외부 세계는 유니 코드가 아니기 때문이다. 우리는 성능을 저하 시키거나 사람들이 Java와 같은 많은 추가 작업을 수행하도록 요구해야합니다. php6 유니 코드 노력이 효과가 없었던 이유입니다.
StasM

8
유니 코드의 경우 : 어려울 수도 있지만 매우 유용 할 것입니다 (확실히 PHP 자체를 개발하는 것은 어렵지만 큰 이점을 제공합니까?)? 아마도 perf 교환으로 이해되는 확장을 통해 투명한 유니 코드를 활성화하는 것이 해결책 일 것입니다. XHP처럼? 다시 감사합니다.
Funkatron

5
$ object = (object) array ( "foo"=> 'bar', baz => 'boo');
mercutio

3
"대부분의 외부 세계는 유니 코드가 아닙니다"를 어떻게 볼 수 있습니까? 사람들에 대해 이야기하고 있습니까? 또는 다른 것? 전 세계 대부분의 사람들이 ( 마진으로) 유니 코드로 가장 잘 표현되는 언어를 사용하기 때문입니다.
Dean Harding

1
확실히 유니 코드 지원. 전 세계적으로 사용되는 모든 종류의 앱을 제공하는 것은 시작이 아닌 시작이 아닙니다. PHP 개발자가 적절한 유니 코드 지원으로 엔지니어링이 쉽다고 생각하는지 여부는 중요하지 않습니다. 사람들은 그것을 필요로하고 있으며, 플랫폼의 실패에 대해 해킹하고 있습니다. 델파이는 다른 문자열 유형을 추가하고 암시 적 캐스팅과 이전 동작을 다시 가져 오는 전역 스위치를 사용하여 기본값으로 설정하여이를 수행했습니다. PHP는 왜 같은 방식으로 할 수 없습니까?
Joeri Sebrechts

48

이전의 오랜 PHP 사과 학자로서 내가 원하는 것 :

  1. 배열의 짧은 구문. PHP 배열은 유연성으로 인해 언어의 가장 멋진 기능 중 하나이지만 작성하기가 쉽지 않습니다 some_array_method($argity, array('key' => $value));. 안타깝게도이 제안이 이미 PHP 메일 링리스트에서 열렸다고 생각합니다.
  2. finally 지원하다
  3. 속성 / 주석 이를 통해 코드 재사용을 허용하는 방식으로 메소드에 사용자 정의 동작을 추가 할 수 있습니다. 예를 들어, MVC 프레임 워크에서 AuthorizeAttribute컨트롤러 또는 동작 방법이 사용자에게 권한을 부여해야 함을 나타내는 것을 정의 할 수 있습니다. 프레임 워크 자체는 속성을 찾고 그에 따라 작동하는 역할을합니다. PHPUnit은 docblock 주석에 속성을 사용하여 이미 일종의 속성을 사용한다고 생각합니다.이 속성은 리플렉션을 사용하여 읽을 수 있지만 docblock 주석에 실제 기능을 넣는 것은 확실히 해킹입니다.
  4. 짧은 람다 구문. 글을 쓰는 대신에 function($x){ return $x*2;}$x => return $x*2을 쓰거나 무언가를 쓸 수도 있습니다. 이것은 다시 일종의 기능으로이 기능을 사용하기 위해 드래그하는 것입니다. 예를 들어 $results = array_filter(array(1,2,3), function($a) { return $a % 2; }):$results = array_filter(array(1,2,3), $a => return $a % 2 );전자는 훨씬 더 많은 배관을 가지고 있으며 기본적으로 달성하려는 실제 작업과 관련이 없습니다.
  5. Decimal연산자 오버로드가 없기 때문에 일반 연산자를 통해 수학 연산을 지원 하는 내장 (고정 소수점 수학)은 좋을 것입니다.
  6. 무어 마술 방법. 마술 방법이 훌륭합니다. 나는 마법의 메소드를 통해 PHP가 연산자 오버로드를 추가하는 것을 볼 수 있었다.

48

PHP를 진정한 객체 지향으로 만드십시오. slap on another global functionPHP 의 진화는 끝나야합니다.

array_merge(array_filter(array_intersect_key($arr1, $arr2), "is_int"), $arr3);

이 책을 읽기가 어렵습니다. 나는 내 자신의 정신 스택을 만들고 직접 컴파일해야합니다. 기본적으로 반대로 읽으십시오. $dog->wakeup()->bark();에 비해 읽기 쉽다bark(wakeup($dog))

$arr1->array_intersect_key($arr2)->array_filter("is_int")->array_merge($arr3);

객체 / 메소드 지원을 활성화하기위한 단계를 만들었습니다. 실제 핵심 PHP 함수에서 사용하십시오.

500 개의 기능 이름을 바꾸고 매개 변수 순서를 변경합시다.

이 기능을 메소드로 변경하면 일부를 일관되게 사용하여 이름을 바꿀 수 있습니다. 문자열과 배열에 자체 메서드가 있으면 이전 버전과의 호환성이 손상됩니까?


3
PHP에서 배열이 객체 유형이 아닌 것은 큰 실수라고 생각합니다. 모든 종류의 문제를 일으킨다. 불행히도, 그것은 진화적인 것입니다. 확장 또는 사용자 공간으로 원하는 것을 수행 할 수 있습니다. 아마도 SPL에 잘 맞을 것입니다.
StasM

3
동일한 인수가 문자열에 적용됩니다. 나는 단지 방법의 부족을 일반적으로 언급하고 있습니다. Java, Python, C # 등과 같은 언어에는 모두 훨씬 더 읽기 쉬운 코드가 있습니다. 나는 당신이 기능을 찾고 있다고 생각하지만, 손상된 IMO를 고치는 것이 더 나은 보상 일 것입니다.
Keyo

6
아니, 바보처럼 굴지 마 그것은 것dog_wake_up($dog); bark_dog($dog);
Matchu

2
IMHO, 모든 새로운 문자열 메소드는 UTF-8을 예상 및 방출하고 입력이 유효한 UTF-8이 아닌 경우 예외를 발생시켜야합니다. 이는 유니 코드 지원의 주요 재 작업 필요성을 크게 줄입니다.
rjmunro

1
@luiscubal 아니요. 추가 매개 변수는 함수에 추가 할 새로운 것을 발명하면 나중에 매개 변수를 추가 할 수 없음을 의미합니다. 예를 들어 $ string => trim () 만 공백 (4.1.0 이전)을 수행 한 경우 시스템은 $ string => trim ( 'ISO-8859-1')에서 공백을 ISO-8859-1 문자열에서 다듬 었다고 말합니다. . 그런 다음 공백이 아닌 항목을 트리밍하려면 사람들이 인코딩을 먼저 지정하지 않으면 해당 매개 변수를 추가 할 수 없습니다. UTF-8이 아닌 모든 텍스트가 잘못 되었다고 생각하도록 사람들을 격려해야합니다 .
rjmunro

40

언어 통합 쿼리 엔진이 좋을 것입니다. LINQ라는 .NET에서 사용할 수있는 것과 비슷합니다. 대량의 데이터 배열을 정렬하고 데이터베이스 액세스를 표준화하여 SQL 주입 공격이 줄어 듭니다.


2
매개 변수화 된 쿼리를보다 쉽게 ​​만드는 것은 내 투표를 얻는 것입니다!
Dean Harding

1
표준화 된 데이터베이스 액세스는 실제로 LINQ와 같은 중요한 이점이라고 생각합니다. 왜냐하면 SQL 쿼리 대신 PHP 코드를 모방하고 있기 때문에 데이터베이스 개체 모의를 사용하여 단위 테스트를보다 쉽게 ​​수행 할 수 있다고 생각하기 때문입니다.
davidtbernal

나는 이것과 같은 것이 핵심에 들어가야한다고 생각하지 않습니다. 그것은 pecl 확장에 더 잘 맞을 것입니다
harald

38

오. 프리미티브에 대한 힌트 힌트. 좋을 것입니다.


1
필자는 PHP의 KISS 원칙 (확장)을 좋아하지만 그 점을 두 번째로 강조합니다. 그 이유는 정말로 방어 적이기를 원한다면 setter 메소드 에서 동일한 유형 검사 코드로 끝나기 때문 입니다. 언어가 기본적으로 지원하는 경우 쉽게 삭제할 수 있습니다.
MicE

4
"타입 힌트"는 "힌트"가 아니기 때문에 매우 유감스러운 이름이었습니다. 엄격한 타이핑입니다. 필자는 원시 엄격한 타이핑이 PHP와 같은 동적 언어에서 적절하지 않을 것이라고 생각합니다. 강제적 인 타이핑 (내부 함수와 동일한 것-strlen (123) 시도)은 정상일 수 있습니다.
StasM

6
이것을 위해 +1. 함수 선언에서 타입 힌트 (또는 엄격한 타이핑)는 엄청나게 도움이되며 각 메소드마다 if (! is_int ()) 쓰레기를 많이 줄입니다.
Phil Sturgeon

5
@StasM 동의하지 않습니다. 동적 언어의 범위와 완벽하게 일치하여 사용자가 정적으로 입력 된 방식으로 언어를 사용하도록 선택할 수 있습니다. 그리고 훨씬 더 나은 오류 포착을 허용합니다. 원하지 않는다면 그것을 사용할 필요는 없지만 개인적으로 나는 int를 원했던 곳에서 문자열을 전달 한 다음 어리석은 문자열이 어디로 전달되는지 알아 내기 위해 코드를 검색해야합니다. 그렇지 않으면 항상 모든 것을 점검하는 것을 입력하십시오.
Daniel Bingham

2
@StasM 완전히 정적으로 유형이 지정된 변수를 도입해야 할 이유는 없습니다. 예, 코드에서 오류를 이동시킵니다. 그게 요점입니다. 오류는 함수 내부가 아닌 함수 호출 시간에 발생하므로 오류가 실제로 발생하는 위치를 알 수 없습니다. 유형 변환 오류의 경우 오류는 함수 호출시 (예 : 런타임시) 발생합니다. 바로 올바른 유형으로 변환하여 문제를 해결하십시오. int를 기대하고 어디서 알지 못하는 함수에 문자열을 표시하는 것보다 훨씬 낫습니다.
Daniel Bingham

34

나는 즉시 더 나은 유니 코드 지원을 원합니다. 대부분의 언어는 그 방향으로 움직이지만 PHP에는 여전히 이상한 명령이 흩어져 있습니다.

PHP 문자열은 단순한 바이트 배열입니다. 콘텐츠는 현재 기본 인코딩에 의존하므로 이식 할 수 없습니다.

serialize로 작성된 표현에도 동일하게 적용됩니다. 실제로 인코딩 정보를 저장하지 않고 문자열의 길이 접두사 바이트 표현을 포함합니다.

대부분의 PHP (문자열) 함수에는 유니 코드에 대한 실마리가 없습니다. 각 기능의 위험 수준을 포함한 자세한 목록은 다음을 참조하십시오 : http://www.phpwact.org/php/i18n/utf-8

http://blog.ginkel.com/2010/03/php-unicode-support-or-the-lack-thereof/


유니 코드 지원은 생각보다 훨씬 어렵습니다. 그래서 php6 노력이 중단되었습니다. 현재 우리는 utf-8을 가지고 있으며 최선의 방법은 문자열 확장 기능에 대한 utf-8 지원을 추가하는 것입니다.
StasM

3
BTW, 견적이 잘못되었습니다. PHP 문자열은 바이트 배열이지만 내용은 이식성이 뛰어나고 "기본 인코딩"에 의존하지 않습니다. 바이트 배열 일뿐입니다. utf8에 넣고 utf8에 넣고 utf16에 넣고 utf16에 넣으십시오. phpwact.org 링크가 죽은 것 같습니다.
StasM

1
나는 intl 확장이 기본적으로 활성화되기를 희망하므로 UTF-8 (모두가 아닌가)을 필요로하는 사람들은 문자열 기능이 예상대로 작동하도록 호스트와 싸울 필요가 없었습니다.
Emil Stenström

또한 문자열에 대한 설명을 해주셔서 감사합니다. 나는 한동안 PHP를 사용하지 않았기 때문에 조금 녹슬었다. 내가 대신 스웨덴의 "O"당신의 이름이 엉망입니다 :)에서 갖는 파이썬 3에서 그들을 PHP가 마찬가지로 유사한 문제가 파이썬과 유니 코드 전쟁을하지만, 해결 한
에밀 Stenström

이것은 확실히 개선되고 싶은 분야 중 하나입니다.
Nathan Osman

32

일관되지 않은 이름을 가진 매개 변수가 아닌 객체를 대체하는 내장 메서드를 사용하여 문자열을 객체처럼 만듭니다. 예 :

$subject->replace($search,$replace);
$string->split($separator);
$string->trim();

기타

편집 : 한 가지 더 : 인코딩을 다루기 위해 특별히 고안된 방법을 제외하고 이러한 방법은 항상 UTF-8을 기대하고 방출해야합니다. 입력이 유효하지 않은 UTF-8이면 함수의 출력이 인코딩의 영향을받지 않더라도 예외가 발생해야합니다.


그것이 바로 제가 목표로하는 것입니다.
Kemo

1
subject->verb(object)매개 변수 순서를보다 쉽게 ​​기억할 수 있습니다.
Ming-Tang

+1 나는 이런 종류의 일을하기 위해 내 자신의 문자열 클래스를 만들면서 놀고, 코딩을 훨씬 쉽게하고 매개 변수 순서를 잊지 않습니다.
DisgruntledGoat

2
그래서 무엇이 is_object($string)돌아 올까요? 이것은 이전 버전과의 호환성을 크게 떨어 뜨리거나 실제로는 직관적이지 않지만 거의 보이지 않는 객체를 도입하게됩니다.
Tgr

@Tgr : is_object ()는 더 이상 사용되지 않아야합니다. "객체가 아님"과 같은 것은 없어야합니다. 단기적으로는 모든 객체를 끌 수있는 속성이어야하며 기본 문자열 생성자는이를 해제합니다.
rjmunro

24

1) 새로 인스턴스화 된 객체가 "$ this"를 반환하도록하고 싶습니다. 그래서 메소드 체인 $ user = new User ( 'john')-> setLastName ( 'Doe')-> save ();

2) 루비와 가장 최근의 노드를 사용한 적이 있다면 훌륭한 대화식 쉘 (IRB)이 있습니다. PHP가 실제로 유용한 것을 갖기를 원합니다.

3) 특성 / Mixins, 그러나 나는 그것이 진행되고 있다고 들었습니다.

4) 짧은 배열 $ myArray = [ 'my', 'array'];

5) 일관된 이름 지정 / 순서 (예 : 니들 건초 더미)


나는 create()# 1을 해결하기 위해 특별한 것을 수행하지 않는 메소드 를 만드는 것이 싫어 !
Alan Pearce

나는 늦게 정적 바인딩과 객체 수퍼 클래스를 사용하지만, 수퍼 클래스를 확장하는 모든 클래스는 메소드를 가진다. 예를 들면 : SomceClass extends SuperObject {}; SomeClass :: create ()-> somemethod ();
dukeofgaming

github.com/philsturgeon/php-ps를 살펴보십시오. 시작일 뿐이지 만 도움이 필요하면 매우 유용 할 수 있습니다.
Phil Sturgeon

1
PHP로 빠른 실험을 코딩 할 수있는 대화식 쉘을 제공하는 PEAR 패키지도 있습니다. pear.php.net/package/PHP_Shell
kguest

(new Foo ())-> bar ()는 5.4의 일부입니다. 3)과 4)도 마찬가지입니다.
StasM

20

1) include ()를 제거하십시오. 다른 파일에 대한 참조는 참조 여야하며 실제로는 한 소스 코드 파일의 내용을 다른 소스 코드 파일에 배치하지 않아야합니다. 너무 많은 PHP 프로그래머는 라이브러리를 참조하는 수단이 아닌 include ()를 함수 호출 유형으로 사용합니다. 이로 인해 변수 상태 및 불안정한 코드에서 모든 종류의 모호성이 발생합니다. 이것을 Perl과 같은 'use'명령으로 바꾸십시오.

2) PHP 응용 프로그램을 단일 배포 가능 바이트 코드 파일 또는 실행 파일로 컴파일하는 즉시 사용 가능한 방법을 제공하십시오 . 이것은 상용 개발 언어로서 PHP의 매력을 크게 향상시킬 것입니다. 언어의 기본 구성 요소 여야합니다. 애플리케이션의 GUI에 사용되는 html 파일에 대해 걱정하지 마십시오.

3) PHP 태그를 HTML에 삽입하는 기능을 제거하십시오. 또는 최소한 '포함하지 않음'모드를 제공하십시오. 이것은 절대 엉망이며 응용 프로그램 논리와 프레젠테이션을 함께 혼합하여 나쁜 디자인을 장려합니다. 개발자는 디스플레이 용 템플릿을 사용해야하며 PHP 파일을 함께 때리지 말고 최상의 결과를 기대해야합니다.

서명,

그랜드 마스터 B

추신 : 다른 사람들의 말을 듣지 마라. 나는 일년 내내 멋졌다.


37
1). 포함이 훌륭합니다. 모든 것이 포함되어 있습니다. 2). 이거 좋다 3) 템플릿은 PHP의 가장 강력한 기능 입니다. 다른 템플릿을 사용하도록 강요하는 것은 매우 나쁜 행동입니다.
Josh K

8
나는 (1)과 (2)를 좋아하지만 (3)은 역행 단계처럼 보입니다. PHP는 템플릿 기능을 제공합니다. 현명하게 사용하는지 여부는 사용자에게 달려 있습니다.
geekbrit

11
3 의미가 없습니다. MVC 프레임 워크의 V에는 태그를 포함해야합니다.
Alex

9
나는이 대답을 "산타에게, PHP는 PHP가 아니도록하십시오"라고 읽었습니다.
Stephen

1
PHP 템플릿 언어 이므로 3은 바로 사용 가능합니다.
Andrew

18

E_ERROR정의되지 않은 상수에 대한 ini 지시문은와 함께 문자열이라고 가정하지 않습니다 E_NOTICE.


1
클래스 상수는 그렇게합니다.
StasM

4
진지하게 PHP가 인용되지 않은 문자열을 가정하게하는 이유를 이해하지 못합니다. 그것은 가장 바보 같은 일입니다. E_ERROR또는 중 하나를 선택합니다 E_PARSE.
BoltClock

14

새로 온 사람들에게 적합한 신중한 명명 규칙으로 글로벌 네임 스페이스를 정규화하십시오!

우리의 사랑하는 Jeff Atwood를 인용하자면 : PHP는 짜증나지만 중요하지 않습니다 !


1
나는 원칙적으로 동의하지만 실제로 어떻게해야할지 전혀 모른다 :)
StasM

3
@ StasM : 첫 번째 단계는 새로운 버전의 라이브러리를 네임 스페이스로 만들고 프로그래머가 (ini 설정을 통해) 현재 전역 라이브러리를 비활성화 할 수있게하는 것입니다. 이전 버전의 경우 호환성 팩이 적합하다고 생각하지만 작성하기가 어렵지 않아야합니다.
Michał T


13

1) 더 짧은 배열 / 객체 구문, la JavaScript

2) const변수가 계산 결과를 허용하도록 허용합니다 define().

3) 생성자에서 직접 연결 : new User()->name('Ryan');

4) 배열 역 참조 : something_that_returns_array()[4];

5) 확장 된 SPL 지원. SPL은 문자열 및 배열 함수 (다른 것들 중에서도)를 객체로 재구성하는 적절한 작업을 수행합니다. SPL을 확장하면 언어가 너무 어색한 것에 대한 많은 문제를 해결할 수 있습니다.

6)를 사용 ArrayObject()하는 것만 큼 투명해야합니다 array(). array_filter($array_object_instance)하지 않고 같은 일을 할 수 있어야합니다 array_filter($array_object_instance->getArrayCopy()). 물론 더 좋을 것입니다 $array_object_instance->filter().

7) Full-on Unicode가 좋을 것입니다.

8) 이상한 자동 유형 변환을 중지하십시오. 예를 들어, echoSimpleXMLElement 객체를 먼저 명시 적으로 문자열로 타입 캐스팅하지 않으면 객체 를 사용할 수 없어야 합니다. 또는 적어도 발생했을 때 무언가를 던지십시오 (예 : 엄격 모드 또는 다른 모드 error_reporting(-1)).

9) 다중 스레드 또는 일종의 이벤트 / 비동기 콜백을 지원합니다. 이것은 cURL을 통해 큰 파일을 업로드하려고 할 때 가장 중요합니다. 구식 스레드 대신 Apple의 Grand Central Dispatch와 같은 것이 좋습니다. 또는 비동기식 요청을하고 콜백을 정의 할 수있는 JavaScript와 같은 것입니다.

10) 일관된 이름 지정 / 순서 (예 : 바늘 건초 더미)는 좋지만 SPL로 더 잘 해결할 수 있다고 생각합니다.

11) IRB와 같이 공식적으로 지원되는 대화식 PHP 쉘. 페이스 북에는 phpsh파이썬으로 작성된 전화 가 있지만보고 싶은 광택이 부족합니다.

12) Reflection API의 경우 (a) 상수에 대한 docblock 주석 (전역 및 클래스) 및 (b) PHPDoc와 유사한 주석을 합리적인 데이터 구조로 구문 분석하는 지원을 추가하십시오. 이 작업을 시도하는 "docblock"이라는 PECL 패키지가 있지만 작성자가 멀리 떨어져있는 것 같지는 않습니다.

편집 : 13) 루비처럼 기능 이름 을 사용 !하고 기능을 사용 하고 ?싶습니다.


array_ * 함수에 대해 arrayobject를 지원해야한다는 데 동의합니다. 그러나 arrayobject의 하위 클래스를 고려하면 "array_merge"와 같은 결과가 예상되는 결과는 무엇입니까? 같은 클래스의 인스턴스 만 병합 할 수 있으며 array_merge는 무엇을 반환합니까? PHP 배열 또는 arrayobject 인스턴스 (각각 서브 클래스)?
harald

내부적으로 데이터가 배열이므로 ArrayObject가 기능을 사용하여 래핑하므로 ArrayObject의 하위 클래스조차도 내부적으로 배열을 사용합니다. 다른 표준 배열이나 ArrayObject (또는 하위 클래스)를 병합 할 수있을 것으로 기대합니다. 그것이 반환하는 한, 새로운 ArrayObject도 반환해야한다고 주장하지만 결과가 인스턴스가되어야하는 클래스의 이름을 지정할 수있는 simplexml_load_string () 세트의 선례를 따르십시오.
Ryan Parman 2016 년

12

1) 파이썬리스트 이해 스타일의 배열 이해 :

$newlist = array($x->something for $x in $oldlist);

//with short array syntax:
$newlist = [$x->something for $x in $oldlist];

2) 짧은 배열 구문

$newlist = [1,2,3,4,...];

3) 문자열 '0'을 참으로 간주하지 않고 비우십시오 ()


2
나는 (1) 반복자와 요리로 요리 한 것이 더 좋을 것이라고 생각합니다.
StasM

+1 IMHO, 모든 언어와 반복자에 포함되어야합니다. 그것들은 가지지 않는 유용한 방법 일뿐입니다.
Evan Plaice

empty()의 논리적 인 반대 if ($x)이므로 false empty('0')이기 때문에 if ('0')사실입니다. 유일한 차이점은 empty()변수가 설정되지 않은 경우 통지를 던지지 않는다는 것입니다.
Andrew

12

CONSTANT 배열을 생성 / 정의하는 합법적 인 방법을보고 싶습니다. 이런 종류의 기능을 시뮬레이트하는 몇 가지 해킹 방법이 있지만 PHP의 직접적인 기능이라면 좋을 것입니다. Java의 "최종"선언과 유사한 방식으로 배열을 만들 수 있다면 좋을 것입니다.

설치가 매우 빠른 로그인 시스템을 만들었습니다. 텍스트 파일에서 배열의 내용을 변경하여 사용자 정보에 대해 원하는 필드를 지정하기 만하면됩니다. 일련의 for 루프를 사용하면 양식 생성 및 입력 감지, 데이터베이스 호출에 이르기까지 모든 것을 처리하지만 모두이 원래 배열에 의존합니다.

어레이가있는 파일은 권한으로 잠겨 있지만 일단 어레이가 에테르에서 이동하면 변경할 수 있습니다. 비록 시스템이 꽤 안전하다고 생각하지만 우연히 아무것도 남기고 싶지 않습니다. 배열을 마무리하는 방법은 이와 같은 상황에 적합합니다.

새로운 생각!!

아, PHP에서 정말로 정말로 원하는 다른 것을 생각했습니다. .htaccess 작동 방식과 비슷한 PHP 파일 작업 및 디렉토리 작업을 제어하는 ​​시스템이 필요합니다.

.phpaccess 파일은 일종의 동일한 도메인 / 동일 출처 정책을 트리거해야합니다.

예를 들어, 가상 호스트로 많은 사이트를 호스팅하는 경우 디렉토리에 .phpaccess 파일이 있으면 php가 보호되는 디렉토리에서 작동하려는 스크립트의 시작을 확인하도록 지시 할 수 있습니다. 스크립트가 해당 디렉토리 또는 해당 서브 디렉토리에서 제공되지 않은 경우 파일 조작 또는 소켓 조작이 거부됩니다.

이와 같은 시스템은 가상 호스팅을 훨씬 안전한 환경으로 만들 것이라고 생각합니다. 이 중 하나를 각 가상 호스트의 맨 위에 배치 할 수 있으면 누군가가 인접한 가상 호스트에서 몰래 침입 할 수있는 방법을 찾을 가능성이 줄어 듭니다.

또한이 방법의 역으로 ​​그것을 확보하는 방법이 있다면 좋을 것입니다. 즉, 단일 디렉토리에서 스크립트의 도달 범위를 해당 디렉토리로 제한합니다.

음과 양은 나중에 알고 있습니다!


일에 대한 final. 명확히하기 위해 : final상수 값과 달리 상수 값과 달리 런타임에 변수 값을 설정할 수 있지만 한 번만 설정할 수 있음을 의미합니다. C #도 참조하십시오 readonly.
davidtbernal

1
읽기 전용 등을 능가하는 트렁크의 getter / setter에 대한 제안이 있습니다. 불변 배열은 어려울 수 있습니다.
StasM

phpaccess로, PHP는 이미 "안전 모드"를 가지고 있습니다.
DisgruntledGoat

11

하드 코어 PHP 프로그래머로서 가장 큰 두 가지 소원 :

  1. 마지막으로 지원하십시오. 깃발이나 비슷한 수단을 통해 허구 적으로이 문제를 해결하는 것은 큰 혼란입니다.
  2. 게터와 세터에 대한 C #의 구문 지원을보고 싶습니다. getter와 setter가 많은 경우 C #과 같은 간단한 구문은 Java 방식으로 getter 및 setter 메소드를 작성하는 대신 훌륭한 성능 향상 도구입니다. 매직 메소드는 멤버를 동적으로 생성하려는 경우 (예를 들어 템플릿 렌더러에 사용할 변수를 제공하려는 경우) 훌륭하지만 IDE가 자동 완성되도록하려는 일반적인 속성에는 적합하지 않습니다. 유형 등. 이것은 코드를 작고 읽기 쉽고 사용하기 쉽게 만드는 데 도움이됩니다.

1
1. 안타깝게도,하기는 어렵지만 확실히 할 일 항목 2. wiki.php.net/rfc/propertygetsetsyntax
StasM

@ StasM : 어노테이션을 통해 어떻습니까? 다음과 같은 내용이 있습니다 : / ** @get getFoo; @set setFoo; * / 개인 $ foo;
Michał T

9

언어 구문 : pihipiphpreboot 에는 개발자가 관심을 갖는 것에 대한 힌트가 있습니다 (phpreboot가 너무 JS가 됨).

개발 방법론 : PHP.net의 조사가 실제로 고려된다면 PHP.net의 수명이 크게 향상 될 것입니다. 더 이상 의지가없는 오후 IRC 세션 구문 결정을하지 마십시오.

개별 특징 : 일부는 이전에 언급되었지만, 나는 약간의 무딘 상태로 행복하게 일부 업장을 태울 것입니다 :

  • 유니 코드 문자열 유형.
  • Bigint (Python 참조)
  • 내장 함수와 클래스를 제거 / 이름 바꾸기 / 재정의하기위한 Runkit 내장. 항상 잘 설계된 것은 아닙니다.
  • 현대 OOP
    • 다중 상속 (서투른 특성 구문으로 드문 경우를 지원하기위한 복잡성 대신)
    • 스칼라는 객체로 두 배가 될 수 있습니다 (파이썬 참조). 예를 들어 array ()는 ArrayObject로 작동하거나 문자열은 SplString으로 사용 가능합니다 (사용 가능한 메소드가 필요합니다. 모든 문자열 기능은로 사용할 수 있어야합니다 str::toupper())
  • shitty shit \네임 스페이스 구문 을 더 이상 사용하지 않고 구문 분석기를 수정하고 ::대체로 채택하십시오 . 당신은 실제 언어처럼 알고 있습니다.
  • LINQ의 모든 변형 (내가 당신을 믿지 않더라도 합리적인 구문을 고 안함)
  • 또는 XML 리터럴.
  • php.ini 런타임 동작 및 의미 체계 스위치를 제거하십시오. 그것은 흥분의 일부를 취하지 만, 개발자와 사용자 기반에 도움이 될 것입니다.
  • 예, magic_quotes는 아직 사라지지 않았습니다.
  • Zend Engine 바이트 코드를 PBC로 변환

그럼에도 불구하고, 이것이 분명하지 않다면, 나는 행복하게 다른 사람을 지원하고 후자를 위해 php.net을 주요 구현으로 죽일 것입니다. :P
아, 방금 커뮤니티 위키입니다. 그래서 당신이 실제로 업장에 대한 것이 아니라 진정한 관심에 빠질 가능성이 있습니다. 그렇다면 언어를 심각하게 해치는 <b> 문제 </ b> (Directoritis)를 살펴보십시오.


5
\ 네임 스페이스 구문이 싫지만 왜 길어지고 슬픈 이야기인지, 왜 그렇게 바뀌지 않았는지 아마 변하지 않을 것입니다 ... 아마도 PHP에서 한 가지만 바꿀 수 있다면 아마도 내 주요 후보가 될 것입니다. 그러나 그것이 바로 그 것입니다.
StasM

@StasM : 의견을 보내 주셔서 감사합니다. PHP에 대해 무례한 점에 대해 죄송하지만 PHP에 관심이 있습니다. 따라서 매우 의견이 많았습니다. -추론에 대해 조금 읽었습니다. 백 슬래시 딜레마는 아직 큰 문제는 아니지만 내년에 도서관이 확산 될 때가 될 것입니다. 따라서 누군가 \ cargo \ cult \ class \ names를 밑줄 체계로 다시 쓰는 파서를 작성하기를 바랍니다.
마리오

어쩌면 나는 바보이지만 네임 스페이스에 '::'또는 '\'를 사용하는지의 차이점은 무엇입니까?
Michał T

@Pies : ::C / C ++ 구문의 가까운 언어에 더 자연 스러웠을 것입니다. `\`는 모든 프로그래밍 언어에서 비정상적 일뿐만 아니라 테스트되지 않은 의미를 가지고 있습니다. 일부 이전 토론 : stackoverflow.com/questions/238550/… 또는 developers.slashdot.org/article.pl?sid=08/10/26/1610259reddit.com/r/programming/comments/79cut/…- 그러나 피드백없이이를 결정하고 개발자 커뮤니티에이를 알리라고 신호하는 것은 그리 환영받지 못했습니다.
마리오

1
다중 상속 + 1000000
ts01

8

오류와 예외가 단일 개념 (예외)으로 통합되는 것을보고 싶습니다. 예외를 잡아 로그에 기록하여 버그를 찾아 수정하는 것이 좋습니다. 그러나 매우 드물게 발견되는 코드 경로에 근본적으로 잘못된 내용 (PHP 오류)이있는 경우 해당 정보를 동일한 문제 데이터베이스에 퍼뜨리는 좋은 방법은 없습니다.

산타, php.ini에서 모든 오류를 예외로 만드는 스위치를 소개하십시오. 이상적으로는 내 코드에서 예외를 잡을 수 있습니다.


1
이미 엔진에서 지원하고 있으며 많은 확장에서 사용합니다. set_error_handler () 및 ErrorException으로 쉽게 수행 할 수 있습니다. 그러나 E_STRICT / E_NOTICE / E_DEPRECATED를 조심하십시오 ...
StasM

나는이 방법을 잘 알고 있으며 실제로 해키입니다. E_STRICT / E_NOTICE 등을 포함하는 통합 된 방식을 원합니다.
알렉스

7

PHP는 중소 규모의 웹 사이트를 노크하는 데 적합합니다. 나는 조금 상상력이 없어야한다.이 질문에 대한 응답으로 생각할 수있는 유일한 것은 트래픽이 많은 사이트에 더 잘 확장 될 수있는 것이다.

다른 프로세스에서 출력 페이지를 만드는 동안 한 프로세스에서 데이터베이스를 업데이트하는 것과 같이 다른 코어로 프로세스를 생성하는 측면에서 생각하고 있습니다. 빠른 Google 검색은 이것이 시뮬레이션 될 수 있지만 현재 PHP에서 직접 지원되지 않음을 나타냅니다.


1
사실, 그것에 대해 더 생각하고, 데이터베이스를 오프 로딩하면 해당 :) 흥미로운 시나리오, 그렇게 한 것 같다
StasM

1
@Stasm, 개별 요청이 별도의 프로세스로 실행된다는 것을 의미한다고 가정합니다. 페이지 생성 및 배경 계산이 필요한 복잡한 페이지에 대해 이야기하고 있습니다. 틀릴 수도 있지만 별도의 프로세스에서 데이터베이스 업데이트 작업을 생성하는 방법이 없다고 생각합니다. 이 작업을 수행하는 이유는 페이지 생성과 직접 관련이없는 모든 처리가 순차적으로 완료 될 때까지 기다리지 않고 페이지를 더 빨리 요청자에게 전송하기위한 것입니다. 추신 .. 업데이트 주셔서 감사합니다!
geekbrit

7

스칼라 유형은 객체로 취급되지 않으며 실제 객체는 다른 유형이나 객체처럼 작동 할 수 없다는 것을 정말로 놓쳤습니다 (__toString ()으로 인한 문자열 제외).


예, 타입 캐스팅을위한 마술 방법을 부탁드립니다.
Michał T

7
  • 열거 지원 (예 : java 1.5 이상)
  • 인터페이스와 클래스에서 메소드 리턴 유형을 정의 할 수 있어야합니다.
  • 속성 및 메서드에 대한 주석 / 메타 데이터 정의 지원
  • 메소드 스칼라 인수에 대해 엄격한 유형 힌트를 수행 할 수 있습니다.

+1 PHP에서이 모든 것들을보고 싶습니다.
Jeremy

6

http://php.net 에서 "사용자 제공 노트"를 정리 하십시오 . 그들은 때로는 큰 가치를 지니고 있지만 때로는 엉망입니다.


1
어떤 종류의 투표 업 / 다운 기능과 답장의 원래 의견에 연결하는 기능은 확실히 좋을 것입니다.
Tgr

5

PHP에는 꽤 괜찮은 배열 함수가 있으며, 콜백과 create_function()기본 람다 미적분을 제공 하는 목록 처리 용량을 제공합니다.

그것의 주요 문제는 PHP에서 너무 장황하다는 것입니다. 특히 map / reduce 명령과 관련하여 단축 시스템이 우수합니다.

더 중요한 것은 목록 기능이 완전히 완료되지 않은 것입니다.

  • foldr기능 이 없으며 array_reduce()제공foldl
  • array_map()로, 두 번째 인수의 핵심을 통과해야 array_walk()합니까
  • array_map_keys()키 수정에 유용 할 수있다
  • 리스트 통합은 매우 투박 range(), array_fill()그리고 array_fill_keys()에만 너무 많은 경우를 처리하고 array_filter()분리

필자는 PHP를 Haskell로 만드는 것을 목표로하지 않지만 PHP는 종종 목록 유형 데이터 구조 조작에 사용되며 이와 관련하여 전체 도구 세트를 갖는 것이 유용합니다.


1
내 동료는 또한 배열 관련 기능에 대한 다른 추가 사항이있을 수 있다고 생각합니다. 그의 github 계정에 언급 된대로 : 이들은 array_all () 및 array_any ()가 부족하여 콜백으로 표시되는 조건이 배열의 모든 또는 모든 요소를 ​​보유하는지 확인합니다. gist.github.com/44350
kguest

5

연산자 과부하 :

$result = $MatrixA + $MatrixB * $MatrixC;

1
PHP가 동적 유형 언어 인 경우 클릭이 얼마나 잘되는지 확실하지 않습니다.
BoltClock

5
아마도 __add ($ obj), __times ($ obj) 등과 같은 마법의 방법을 통해 수행되어야합니다.
Michał T

이미 PECL ext : pecl.php.net/package/operator 로 존재합니다 . 주요 소스와 병합하기에는 너무 많은 작업이되어서는 안됩니다
Xananax

4

E_WARNING을 생성하는 대신 예외 추가 ... 다음과 같은 것을 사용할 수 없다는 것은 매우 성가신 일입니다.

try{
   $f = fopen('asd', 'r');
   flock($f, LOCK_SH);

   while(!feof($f)){
       echo fread($f, 512);
   }

   fclose($f);

}catch(IOException $ex){
   echo 'Oops, something wrong: '.$ex->getCode();
}

물론 현재로서는 실용적이지는 않지만 다음과 같은 것을받는 것은 매우 성가신 일입니다.

경고

경고

경고

올바른 예외를 발생시키기 위해 내 error_handler 및 문자열 스니핑 (허가, 잘못된 파일 이름 또는 다른 것; 여기 다른 오류 소스는 신경 쓰지 않음)을 작성하지 않고 코드 흐름을 제어 할 수 없습니다. .

왜 그것이 중요한지 설명하지 않았기를 바랍니다.

PHP는 얼마 전에 Object-Oriented가되었으며 PHP를 사용하는 프로그래머 인 우리는 "goto"를 소개하지 않고 OO 기능을 기대하고 있습니다.


잡히지 않으면 예외로 인해 스크립트가 종료됩니다. 프로덕션 서버의 경고는 기록되고 사용자에게 표시되지 않습니다. 이 기능을 변경하면 많은 스크립트가 제대로 작동하지 않기 때문에 많은 스크립트가 중단됩니다. (예외를 직접 처리하기 위해 오류 처리기를 작성합니다). 이제 PDO는 경고 나 예외를 던질 수 있습니다. 프로그래머는 런타임에 결정합니다. 이 기능은 더 많은 모듈에 추가되어야 할 기능 일 것입니다.
Reece45

4
  1. 객체 모델 통합-모든 객체가 기본 객체 클래스를 확장하도록합니다. Object 클래스는 (다른 것들 중에서도) 모든 마술 방법을 구현할 것이므로 더 이상 마술이 아닙니다!

  2. 확장을 자체 네임 스페이스로 이동-글로벌 네임 스페이스를 깔끔하게 정리 $conn = new \MySQLi\Connection();

  3. 유엔은-절름발이 spl_autoload()기능을! 진지하게, 이것은 아마도 PHP의 가장 큰 특징 중 하나이며 동시에 가장 쓸모가 없습니다. spl_autoload네임 스페이스와 여러 파일 확장자를 지원하는 기본 오토로더이지만, 알 수없는 이유로 파일 이름을 소문자로 입력해야합니다. 이에 대한 버그 보고서가 작성 되었지만 직원은 이전 버전과의 호환성으로 인해 수정하지 않을 것이라고 대답했습니다. 기본 프레임 워크가 손상되었으므로 모든 프레임 워크에 자체 오토로더가 제공되는 것은 아닙니다.



4

Taint 지원을 최신 버전으로 가져와 표준 빌드에 포함 시키십시오 (기본 설정 http://wiki.php.net/rfc/taint).

이렇게하면 사람들이 코드를 올바르게 작성하여 XSS 및 SQL 주입 공격을 막을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.